2009-10-22 24 views
2

我有一个POCO类,我正在使用NHibernate在WCF服务层。我正在考虑尝试将NHibernate代理类发送到客户端。这是我控制的客户端。我们使用全系统预留来处理记录更新,因此在任何给定时间只能向客户发送一个此实体的可写副本。我的基本目标是利用NHibernates更改跟踪功能,因此我不需要从数据库获取副本并重播客户端为更新数据库所做的更改。与向客户端发送Hibernate代理类相关的问题有什么问题

假设我能得到这个工作有什么缺点这个接近?

+1

如果您完全理解WCF的基本机制,我并不是100%确定的:您所做的只是将对象序列化为**消息**并发送该消息。这意味着:您只能发送实际的具体数据 - 没有行为,没有界面,没有泛型。另一方面,你没有得到“同一个对象” - 对象正在被发送的数据重新组合。如果这将保留一个NHibernate代理中的所有状态信息 - 我非常怀疑它! – 2009-10-22 16:23:53

回答

2

懒惰加载会给你最大的头痛。

对象的一些属性将包含附加到ISession的NHibernate代理。所有这些都会回传给客户。当客户端试图反序列化你的对象时,代理被调用并尝试检索更多的数据。繁荣!

有几种解决方法的人已经发布(谷歌 “NHibernate的WCF” 或 “NHibernate的WCF懒加载”):

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

http://trentacular.com/2009/08/how-to-use-nhibernate-lazy-initializing-proxies-with-web-services-or-wcf/

我目前正在使用自定义的替代代理,所以他们做了一个WCF调用,而不是触发Nhibernate延迟加载。

+0

我喜欢使用WCF的代理的想法,我喜欢有一个使用wcf而不是客户端数据库的ISession的想法。 – 2009-10-22 15:29:52

+0

有人试图这样做,但这个人放弃了它:http://slagd.com/?p=4 – 2009-10-22 16:14:06

4

我不打算从具体技术的角度来回答这个问题,但我希望您能够在做出某些决定时发现这种观点。你应该保持你的实体类型是内部的,因此,与你的服务类型(又名值类型)是分开的。无论如何,很多时候实体对于服务接口来说太细致了。例如,您可能想要返回来自服务层的操作的结果,该操作实际上是实体模型中不同部分数据的组合。不仅如此,并非一个实体的所有领域都必须被客户直接修改。另外,如果你直接暴露你的entitiy类型,你就有可能将自己嫁给潜在的数据库结构,而这些数据库结构在一段时间内可能需要通过可扩展性的原因进行重构。通过将您的服务的价值类型与填充它们的基础实体分离,您可以为自己提供一个可伸缩的灵活性层。

不足之处是你正在编写很多值类型,它们通常看起来很像数据访问层中的实体类型,它们基本上是服务域内的“空壳”。另外你需要映射函数来在这两种类型之间来回转换值。对我来说,这是一笔小小的代价,用于支付随时可用的灵活性。

+0

谢谢,这两个应用程序是如此紧密结合在一起的,客户端和服务器上的域对象实际上是相同的。 – 2009-10-22 15:26:58