波苏斯;坚持无知和DAL依赖(NHibernate)

时间:2011-02-01 09:57:37

标签: c# .net database nhibernate repository

对于依赖关系 POCO 的含义是什么?

使用NHibernate;子集合被检索为 NHibernate.Collection.Generic.PersistentGenericBag<> 。这就是我在这里所说的“依赖”;如果我尝试保存/更新对象图,那么DAL已经对它的内容产生了“意见”。我是如何坚持下去的。

最初,我认为请求POCO会对DAL,存储库,ORM (不确定这个角度中的正确术语)进行无依赖性。但现在我很困惑,因为我想也许只是意味着POCO类没有持久性方法;检索POCO对象图可能仍然带有这样的依赖关系?

所以当你谈论POCO时,你的意思是什么? POCO可以具有这些类型的依赖关系吗?如果它可能并且可能不,您如何“按名称”区分这些依赖关系?

“没有这种依赖性”的POCO在某些方面看起来更像是DTO,但可能有行为,所以它毕竟不是DTO。

另外,只是为了100%肯定:我认为DTO会持续无知而且“没有依赖性”?

也许“依赖”不是正确使用的词,所以万一我是正确的。我希望我的问题仍然可以理解。


EDIT1:

进一步思考;也许我认为...... PersistentGenericBag带来了一些“依赖”是错误的(?)可能它只是一种类型,而不是更神奇。并进一步;对象对NH的唯一依赖是通过ISessions,当然,我们可以控制。那有意义吗?

2 个答案:

答案 0 :(得分:1)

对于你的'DAL'没有依赖于你的对象是一个非常乌托邦。 然而,NHibernate解决它的方式,非常接近恕我直言。

恕我直言,术语POCO意味着您的实体(域对象)不应该从某个基类继承,或者实现某些接口以使DAL工作。
这是NHibernate的情况。但是,确实NHibernate需要一些额外的集合类(比如Iese.Set类),但这主要是因为.NET框架当时没有'Set'类。
NHibernate使用自己的集合类,但在大多数情况下,您 - 开发人员 - 并不会对此感到困扰。

遵循域驱动设计原则时,您的实体可以是POCO,但您的实体肯定不仅仅是DTO。实体应该用数据和行为来表示该实体在现实世界中的样子。

DTO确实应该是无知的,因为它是一个可用于在层之间传输数据的对象。 2层中的一层不一定是您的DAL。例如,您可以使用DTO将业务层中的数据传输到视图层。

答案 1 :(得分:1)

POCO是对框架或任何其他基础结构类没有任何依赖性的类。好吧,NHibernate会使用PersistentGenericBag,但您的POCO只会引用IList类。

对于您的POCO,此实例是ListReadOnlyList还是PersistentGenericBag无关紧要,他会将其视为IList但是会有其他不符合他的行为。

顺便说一句,如果您使用注释映射域Objets,您知道它们与ORM有明显的依赖关系。