C# POCOs;持续无知和DAL依赖(NHibernate)

C# POCOs;持续无知和DAL依赖(NHibernate),c#,.net,database,nhibernate,repository,C#,.net,Database,Nhibernate,Repository,就依赖关系而言,POCO的真正含义是什么 与NHibernate;子集合检索为NHibernate.Collection.Generic.PersistentGenericBag。这就是我这里所说的“依赖性”;如果我试图保存/更新一个对象图,DAL将已经有了关于我试图保存它的内容和方式的“意见” 最初,我认为请求POCO不会对DAL、存储库、ORM产生依赖性(不确定在这个角度中什么是正确的术语)。但现在我感到困惑,因为我在想,这可能只是意味着POCO类没有持久性方法;检索POCO对象图可能仍然具

就依赖关系而言,POCO的真正含义是什么

与NHibernate;子集合检索为NHibernate.Collection.Generic.PersistentGenericBag。这就是我这里所说的“依赖性”;如果我试图保存/更新一个对象图,DAL将已经有了关于我试图保存它的内容和方式的“意见”

最初,我认为请求POCO不会对DAL、存储库、ORM产生依赖性(不确定在这个角度中什么是正确的术语)。但现在我感到困惑,因为我在想,这可能只是意味着POCO类没有持久性方法;检索POCO对象图可能仍然具有这种依赖性

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

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

另外,为了100%确定:我假设一个DTO将是持续无知的,并且“没有依赖性”

也许“依赖性”这个词用得不恰当,所以请纠正我。我希望我的问题仍然可以理解


EDIT1:


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

在“DAL”方面对对象没有依赖性是一个理想国。 然而,NHibernate解决这一问题的方法与IMHO非常接近

在IMHO中,术语POCO意味着您的实体(域对象)不必从某个基类继承,也不必为了DAL的工作而实现某些接口。
NHibernate就是这样。然而,NHibernate确实需要一些额外的集合类(如Iese.Set类),但这主要是因为.NET framework当时没有“Set”类。
NHibernate使用它自己的集合类,但在大多数情况下,您——开发人员——不会为此而烦恼

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


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

POCO是对框架或任何其他基础结构类没有任何依赖关系的类。嗯,NHibernate确实使用了
PersistentGenericBag
,但是您的POCO将只引用
IList

对于您的POCO,无论此实例是
列表
只读列表
还是
持久通用包
,他都会将其视为
IList
,但会有其他不由他处理的行为


顺便说一句,如果你正在用注释映射你的域对象,你知道它显然依赖于ORM。

至于列表,它是非常透明的。我通常对我的所有收藏使用
IList
。然后nhibernate可以使用它喜欢的任何实现,我的代码并不真正关心。在我看来,我的POCO没有依赖关系。谢谢!我的想法是,当使用DTO(NHibernate->DTO->BusinessPOCO)时,根据设计,POCO“没有依赖性”。如果使用NHibernate->BusinessPOCO,则POCO可能(?)具有依赖性。我在may上加了一个(?),比如:它是“必须”的,还是我可以通过编写存储库的方式“轻松”决定这个问题?@jgauffin:注意,IList和ISet之间有语义上的区别;nHibernate对待他们不一样,是的。ISet需要唯一的项,而IList不需要。但是,如果数据库/存储库设计正确,这并不重要。在某些情况下,即使数据库设计正确,这也很重要。(例如,包含另一个关联的项目关联)。干杯!我正在用FluentNH绘制地图。我明白你的观点,这是类似的列表类型。但这似乎意味着我需要注意“如何”执行CRUD操作,因为NHibernate可能不愿意做某些事情。但这方面我仍然不太了解,我正在处理这样的CRUD异常,所以当我理解它的工作原理时,可能有更多的优点而不是缺点。