DDD映射实体框架数据模型到领域模型
本文关键字:领域模型 数据模型 框架 映射 实体 DDD | 更新日期: 2023-09-27 18:14:59
我理解实体数据模型应该与实际领域模型分离,以避免基础设施问题与领域本身之间的耦合,但我想知道如果所有领域属性都没有公共setter,我们如何从数据模型映射到领域模型,特别是如果存储库实现驻留在项目的基础设施部分,所以我们不能使用内部属性setter。
class DomainModel
{
string SomeProperty {get; private set:}
}
在一个模式中,你有一个中间的"数据模型",实体框架不再控制你的领域实体是如何实例化的。您的存储库有。所以它们不一定需要公共setter,你也可以使用构造函数来补充它们。
这里解释了一种这样的技术:https://vaughnvernon.co/?p=879
请注意,如果您认为EF对实体的影响很小,那么一个更简单的替代方法是避免额外的数据模型并使用私有setter(参见https://lostechies.com/jimmybogard/2014/04/29/domain-modeling-with-entity-framework-scorecard/)。
我理解实体数据模型应该与实际领域模型分开
不正确
真正避免基础结构关注和域本身之间的耦合
您可以使用EF来直接持久化您的域模型,但是您不应该将您的域模型耦合到EF。
这看起来像什么?
假设您有一个名为Domain
的项目,其中包含您的模型,另一个名为DataStore
的项目包含您的存储库来持久化这些模型(使用EF)
现在通常使用EF,你会在你想要持久化的模型上使用属性和各种无意义的东西,但这会污染&将这些模型耦合到EF作为存储机制;从你的纯Domain
项目中添加依赖到EF -这是我们试图避免的。
EF6拯救,看看EF6 FluentApi,您可以配置您的域模型来使用EF,而无需向Domain
项目添加任何EF特定的属性或依赖关系。
主键?
modelBuilder.Entity<OfficeAssignment>().HasKey(t => t.InstructorID);
指数吗?
modelBuilder
.Entity<Department>()
.Property(t => t.Name)
.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute()));
如果对每个对象都这样做,这很快就会变成一件痛苦的事情,但是如果你坚持一些约定(或者使用基本类型使之更容易)
然后你可以使用反射来做这个auto-magically
在你的域内的所有实体。