【问题标题】:What are the problems associated with sending a Hibernate Proxy class to clients向客户端发送 Hibernate 代理类有哪些问题
【发布时间】:2009-10-22 22:44:33
【问题描述】:

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

假设我可以让它工作这种方法有什么缺点?

【问题讨论】:

  • 我不能 100% 确定您是否完全了解 WCF 的基本机制:您所做的只是将对象序列化为 消息 并将该消息发送出去。这意味着:您只能发送实际的、具体的数据——没有行为、没有接口、没有泛型。另一方面,你得到的不是“同一个对象”——对象是从发送的数据中重新组合的。如果这将保留 NHibernate 代理中的所有状态信息 - 我非常怀疑它!

标签: .net wcf nhibernate


【解决方案1】:

我不打算就具体技术来回答这个问题,但我希望你发现这种观点对做出一些决定很有用。

恕我直言(以及那些关注Domain-driven Design 的人),您应该将实体类型保留在内部,因此与您的服务类型(又名值类型)分开。很多时候,实体对于服务接口来说太细了。例如,您可能希望从服务层的操作返回结果,该结果实际上是实体模型中不同数据的组合。不仅如此,而且并非实体的所有字段都必须由客户端直接可变。此外,如果您开始直接公开您的实体类型,您就有可能将自己与底层数据库结构结合起来,随着时间的推移,出于可伸缩性的原因,可能需要对其进行重构。通过将服务的值类型与填充它们的底层实体分离,您可以为自己提供一个重要的灵活性层。

缺点是您要编写大量值类型,这些值类型基本上是服务域中的“空壳”,通常看起来很像数据访问层中的实体类型。另外,您需要映射函数来在两种类型之间来回转换值。对我来说,这是为未来提供的灵活性付出的小小代价。

【讨论】:

  • 谢谢,这两个应用程序是如此紧密耦合,域对象在客户端和服务器上实际上是相同的。
【解决方案2】:

延迟加载会让你最头疼。

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

人们发布了几种解决方法(Google“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 延迟加载。

【讨论】:

  • 我喜欢使用 WCF 的代理的想法,我有点喜欢使用 wcf 而不是客户端的 db 的 ISession 的想法。
  • 有人尝试这样做,但那个人放弃了它:slagd.com/?p=4
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-27
  • 1970-01-01
  • 2019-04-29
相关资源
最近更新 更多