【发布时间】:2010-12-10 06:59:07
【问题描述】:
我们目前有一个应用程序,它通过 Web 服务从服务器检索数据并填充 DataSet。然后 API 的用户通过对象来操作它,这些对象反过来又改变了数据集。然后将更改序列化、压缩并发送回服务器以进行更新。
然而,我已经开始在项目中使用 NHibernate,我真的很喜欢 POCO 对象的不连贯性。我们现在遇到的问题是,我们的对象与内部 DataSet 绑定在一起,以至于它们无法在许多情况下使用,最终导致重复的 POCO 对象来回传递。
Batch.GetBatch() -> calls to web server and populates an internal dataset
Batch.SaveBatch() -> send changes to web server from dataset
有没有办法实现我们正在使用的类似模型,所有数据库访问都通过 Web 服务进行,但使用 NHibernate?
编辑 1
我有一个部分解决方案可以通过 Web 服务运行并持续存在,但它有两个问题。
- 我必须序列化并发送我的整个收藏,而不仅仅是更改的项目
- 如果我在返回对象时尝试重新填充集合,那么我拥有的所有引用都会丢失。
这是我的示例解决方案。
客户端
public IList<Job> GetAll()
{
return coreWebService
.GetJobs()
.BinaryDeserialize<IList<Job>>();
}
public IList<Job> Save(IList<Job> Jobs)
{
return coreWebService
.Save(Jobs.BinarySerialize())
.BinaryDeserialize<IList<Job>>();
}
服务器端
[WebMethod]
public byte[] GetJobs()
{
using (ISession session = NHibernateHelper.OpenSession())
{
return (from j in session.Linq<Job>()
select j).ToList().BinarySerialize();
}
}
[WebMethod]
public byte[] Save(byte[] JobBytes)
{
var Jobs = JobBytes.BinaryDeserialize<IList<Job>>();
using (ISession session = NHibernateHelper.OpenSession())
using (ITransaction transaction = session.BeginTransaction())
{
foreach (var job in Jobs)
{
session.SaveOrUpdate(job);
}
transaction.Commit();
}
return Jobs.BinarySerialize();
}
如您所见,我每次都将整个集合发送到服务器,然后返回整个集合。但我得到的是一个替换的集合,而不是一个合并/更新的集合。更不用说在只能更改部分数据的情况下来回发送所有数据似乎效率非常低。
编辑 2
我在网上看到了几篇关于几乎透明的持久性机制的参考资料。我不确定这些是否会起作用,而且它们中的大多数看起来都是实验性的。
- ADO.NET Data Services w/NHibernate (Ayende)
- ADO.NET Data Services w/NHibernate (Wildermuth)
- Custom Lazy-loadable Business Collections with NHibernate
- NHibernate and WCF is Not a Perfect Match
- Spring.NET, NHibernate, WCF Services and Lazy Initialization
- How to use NHibernate Lazy Initializing Proxies with Web Services or WCF
我很难找到我们今天使用的 DataSet 模型的替代品。我想摆脱该模型的原因是因为将每个类的每个属性与数据集的行/单元格联系起来需要做很多工作。然后它也将我所有的类紧密地耦合在一起。
【问题讨论】:
-
您的客户端和服务器是什么版本的 .net?您是否需要与非 .net 客户端进行通信?(或者您想要多紧密的耦合?)
-
版本 3.5,我们不需要与 .NET 以外的任何东西进行互操作。就我而言,它可以完全绑定到.NET。我们构建客户端和服务器。
标签: web-services nhibernate dataset asmx