我有一个POCO类,我在WCF服务层使用NHibernate。我正在考虑尝试将NHibernate代理类发送给客户端。这是我控制的客户端。我们使用系统范围的预留来处理记录更新,因此在任何给定时间只能将一个可写的此实体副本发送给客户端。我的基本目标是利用NHibernates更改跟踪,这样我就不需要从数据库中获取副本并重放客户端为更新数据库所做的更改。
假设我可以让这个工作得到帮助吗?
答案 0 :(得分:4)
我不打算在具体技术方面回答这个问题,但我希望你发现这种观点对做出一些决定很有帮助。
恕我直言(以及关注Domain-driven Design的人)你应该将你的实体类型保持在内部,从而与你的服务类型(也就是价值类型)分开。通常,实体对于服务接口来说太过细化了。例如,您可能希望从服务层的操作返回结果,该操作实际上是实体模型中不同数据的组合。不仅如此,而且实体的所有字段都不一定是客户可以直接变更的。此外,如果您直接开始公开您的权利类型,您就有可能将自己与基础数据库结构结合在一起,由于可扩展性的原因,这些数据库结构随着时间的推移可能需要重构。通过将服务的值类型与填充它们的基础实体分开,您可以为自己提供一个非常重要的灵活性层。
缺点是您正在编写许多值类型,这些类型在服务域内基本上是“空壳”,通常看起来很像数据访问层中的实体类型。另外,您需要映射函数来在两种类型之间来回转换值。对我来说,这是为了提供灵活性而付出的小代价。
答案 1 :(得分:2)
延迟加载会给你带来最大的麻烦。
对象上的某些属性将包含附加到ISession的NHibernate代理。所有这一切都会回到客户端。当客户端尝试反序列化您的对象时,将调用代理并尝试检索更多数据。 BOOM!
人们发布了几种解决方法(Google“ nhibernate wcf ”或“ nhibernate wcf lazy loading ”):
http://lunaverse.wordpress.com/2007/05/09/remoting-using-wcf-and-nhibernate/
http://timvasil.com/blog14/post/2008/02/WCF-serialization-with-NHibernate.aspx
http://whiletrue.nl/blog/?p=37
我目前正在使用自定义代理交换代理,因此他们进行WCF调用而不是触发Nhibernate延迟加载。