gpt4 book ai didi

domain-driven-design - 在 DDD 架构中将表映射到域类

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

我的应用程序分为几个程序集。

MyProject.Core 程序集包含所有域对象(例如 Person 和 Sale)以及接口(interface)存储库(例如 IPersonRepository 和 ISaleRepository)。

MyProject.Data 应该处理持久性,但我对它应该如何工作有点困惑。我应该使用 Entity Framework 将我的表映射到域模型吗?我应该使用 Fluent API 执行此操作吗?还是我应该实例化模型类并手动填充它们?

最佳答案

IMO 您不应尝试将域模型对象用作 Entity Framework 实体。您将无法制作由原子方法组成的正确封装的域对象。相反,他们需要具有 EF 所需的 getter 和 setter 的公共(public)属性,这会导致 Anemic Domain Model .
本质上:如果您尝试将域对象加倍为 Entity Framework 实体,您将损害设计。
相反,我使用了与 memento pattern 大致相似的东西。 ,从而我使用充当“纪念品”的 EF 实体重新水化我的域对象。 Vaugh Vernon 称这些对象为 "state objects"
鉴于 EF 可以只使用普通的 POCO,我会将这些类放在与托管 DbContext/Respositories 的程序集不同的程序集中,因为您的模型需要引用它们。因为它们只是 POCO,所以您不会将模型绑定(bind)到 EF。
所以你可能有三个程序集:

  • MyProject.Model/MyProject.Core/MyProject.Domain ... 包含您的 DDD 模型类和存储库接口(interface)
  • MyProject.Infrastructure ... 包含 DBContext、存储库实现和状态对象

  • 例子:
    public class PersonRepository  : EntityFrameworkRepository, IPersonRepository
    {
    public Person GetById(Guid personId)
    {
    using (MyDbContext ctx = new MyDbContext())
    {
    var personState = (from p in ctx.People
    where p.PersonId == personId
    select p).FirstOrDefault();


    return Person.RestoreFromState(personState );

    }
    }
    }
    更新
    借助 EF Core,您现在可以映射到私有(private)字段,因此您可能不需要添加这种复杂程度来保持设计的完整性。
    另外,我推荐 Vaughn Vernon 关于这个主题的以下帖子: https://kalele.io/modeling-aggregates-with-ddd-and-entity-framework/

    关于domain-driven-design - 在 DDD 架构中将表映射到域类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17014398/

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