代码之家  ›  专栏  ›  技术社区  ›  Aaron Fischer

向客户端发送Hibernate代理类有什么相关的问题?

  •  2
  • Aaron Fischer  · 技术社区  · 15 年前

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

    假设我可以让这个工作,这个批准的缺点是什么?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Vijay Patel    15 年前

    懒惰的装载会让你头疼。

    对象上的某些属性将包含附加到ISession的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延迟加载。

        2
  •  4
  •   Drew Marsh    15 年前

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

    imho(以及跟随者 Domain-driven Design )您应该将实体类型保持在内部,从而与服务类型(即值类型)分开。通常情况下,实体对于服务接口来说过于粒度化。例如,您可能希望返回服务层操作的结果,该操作实际上是实体模型中不同数据块的组合。不仅如此,并非实体的所有字段都必须由客户直接可变。此外,如果您开始直接暴露您的实体类型,那么您就有可能将自己与底层数据库结构结合在一起,随着时间的推移,由于可伸缩性的原因,这些数据库结构可能需要重构。通过将服务的值类型与填充它们的基础实体分离,您可以为自己提供一个非常重要的灵活性层。

    缺点是,你写了很多值类型,它们基本上是服务域中的“空外壳”,通常看起来很像数据访问层中的实体类型。此外,还需要映射函数在两种类型之间来回转换值。对我来说,这是一个很小的代价来支付柔性,这是提供了道路。