我挖掘了很多关于DDD方法(无处不在的语言、聚合、存储库等)我认为,与我读到的很多内容相反,实体应该有行为而不是不可知论。我看到的所有例子都倾向于呈现实体虚拟自动属性 and an 空构造函数(受保护或最糟糕的是公开)就是这样。我认为这种对象更像是 DTO,而不是实体。
我正在处理创建一个框架及其特定的 API,我不想绑定到 ORM。因此,我首先构建了域(不考虑持久性),现在我想使用 NHibernate 作为持久性工具,因此我在当前的解决方案中添加了一个新项目,以帮助确保我的模型不会更改以支持 NHibernate。该项目应该是我域内抽象存储库的实现。现在困难出现了。
Since 这是我第一次使用 NHibernate(我也在尝试 Fluent Nhibernate,但它似乎更具限制性)我想知道:
- 是否可以在不改变作为框架一部分的 DDD 模型的情况下使用 NHibernate
- NHibernate 按预期高效工作所必需的东西(约束)(虚拟属性、空构造函数等)我认为这个列表对很多开始学习 NHibernate 的人会有帮助。
请记住,我正在构建一个框架,因此开闭原理 http://en.wikipedia.org/wiki/Open/closed_principle对我来说非常重要。
P.S.:抱歉,如果我的英语不好,我来自蒙特利尔,我说法语。
Edit 1:这是我现在使用 NHibernate 时遇到的一个问题 -如何使用 Nhibernate(和 Fluent NHibernate)映射类型 https://stackoverflow.com/questions/1516752/how-to-map-type-with-fluent-nhibernate
- For NHibernate:
- 所有映射的类都需要一个默认(无参数)构造函数。默认构造函数不必是公共的(它可以是私有的,这样它就不是 API 的一部分),但它必须存在。这是因为 NHibernate 必须能够创建映射类的实例而不传递任何参数。 (有解决方法,但不要这样做。)
- 必须标记需要延迟加载的所有映射属性
virtual
。这包括所有引用属性和所有集合属性。这是因为 NHibernate 必须能够生成派生映射类并覆盖映射属性的代理类。
- 所有映射的集合属性都应使用接口作为属性类型。例如,使用
IList<T>
而不是List<T>
。这是因为 .NET Framework 中的集合类型往往是密封的,NHibernate 必须能够用自己的集合类型实例替换集合类型的默认实例,并且 NHibernate 有自己的集合类型的内部实现。
- 对于 NHibernate,更喜欢
Iesi.Collections.Generic.ISet<T>
to System.Collections.Generic.IList<T>
,除非你确定你想要的实际上是list而不是一个set。这需要熟悉理论定义list and set以及您的领域模型的要求。当您知道元素必须按某种特定顺序排列时,请使用列表。
另请注意,交换对象关系映射框架通常并不容易,并且在许多情况下,当您拥有超出简单域模型的任何内容时,这是不可能的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)