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

标签 domain-driven-design

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

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/

    相关文章:

    php - php 应用程序中的命令模式 : how to handle controller actions?

    domain-driven-design - 为什么传奇(又名流程管理器)包含内部状态,为什么它们会持久化到事件存储中?

    c# - DDD 使用事件或服务?

    architecture - 了解 DTO 和贫血域模型

    design-patterns - Windows 服务的六边形架构/端口和适配器架构。正确的路?

    nhibernate - 持久性无知可以扩展吗?

    events - DDD,Saga 和 Event Dispatcher 的区别?

    java - 微服务与事件溯源 (CQRS) 交互的最佳实践

    .net - .NET 的 SOLID DDD ORM 请求(使用干净的实体和存储库)

    oop - 业务规则分为两类