我的应用程序分为几个程序集。
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。
所以你可能有三个程序集:
例子:
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/