gpt4 book ai didi

nhibernate - 是否可以在不更改作为框架一部分的 DDD 模型的情况下使用 NHibernate

转载 作者:行者123 更新时间:2023-12-03 20:35:08 25 4
gpt4 key购买 nike

我挖掘了很多关于 的东西DDD方法 (无处不在的语言、聚合、存储库等)我认为,与我经常阅读的内容相反,实体应该有行为而不是不可知论。我看到的所有示例都倾向于以 呈现实体虚拟自动属性 ​​空构造函数 ( protected 或最坏的,公共(public)的)就是这样。我认为这种对象更像是 DTO,而不是实体。

我正在处理 创建框架使用其特定的 API,我不想成为 绑定(bind)到 ORM .所以我首先构建了域(没有考虑持久性),现在我想使用 NHibernate 作为持久性工具,所以我在我当前的解决方案中添加了一个新项目,以帮助确保我的模型不会被更改以支持 NHibernate。这个项目应该是生活在我的域中的抽象存储库的实现。而现在困难出现了。

这是我第一次使用 NHibernate (我也在尝试 Fluent Nhibernate,但它似乎更具限制性)我想知道:

  • 是否可以在不更改作为框架一部分的 DDD 模型的情况下使用 NHibernate
  • NHibernate 按预期和高效工作所必需的东西(约束)(虚拟属性、空构造函数等)我认为这个列表对许多开始学习 NHibernate 的人会有帮助。

  • 请记住,我正在构建一个框架,所以 Open/Closed Principle对我来说非常重要。

    P.S.:对不起,如果我的英语不好,我来自蒙特利尔,我会说法语。

    编辑 1:这是我现在在使用 NHibernate 时遇到的一个问题 - How to map Type with Nhibernate (and Fluent NHibernate)

    最佳答案

  • 对于 NHibernate:
  • 所有映射类都需要一个默认(无参数)构造函数。默认构造函数不必是公共(public)的(它可以是私有(private)的,因此它不是 API 的一部分),但它必须存在。这是因为 NHibernate 必须能够在不传递任何参数的情况下创建映射类的实例。 (有解决方法,但不要这样做。)
  • 所有需要延迟加载的映射属性都必须标记为 virtual .这包括所有引用属性和所有集合属性。这是因为 NHibernate 必须能够生成派生映射类并覆盖映射属性的代理类。
  • 所有映射的集合属性都应使用接口(interface)作为属性类型。例如,使用 IList<T>而不是 List<T> .这是因为 .NET Framework 中的集合类型往往是密封的,NHibernate 必须能够将集合类型的默认实例替换为它自己的集合类型实例,并且 NHibernate 有自己的集合类型内部实现.
  • 对于 NHibernate,首选 Iesi.Collections.Generic.ISet<T>System.Collections.Generic.IList<T> , 除非你确定你想要的实际上是一个列表而不是一个集合。这需要熟悉列表和集合的理论定义以及领域模型的要求。当您知道元素必须按特定顺序排列时,请使用列表。

  • 另请注意,交换对象关系映射框架通常并不容易,而且在许多情况下,当您有任何超出琐碎领域模型的东西时,这是不可能的。

    关于nhibernate - 是否可以在不更改作为框架一部分的 DDD 模型的情况下使用 NHibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1514278/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com