我理解实体数据模型应该与真正的领域模型分离,以避免基础设施问题与领域本身之间的耦合,但我想知道如果所有领域属性都没有公共设置器,我们如何从数据模型映射到领域模型,特别是如果存储库实现驻留在项目的基础设施部分中,因此我们无法使用内部属性设置器。
class DomainModel
{
string SomeProperty {get; private set:}
}
我理解实体数据模型应该与真正的领域模型分离,以避免基础设施问题与领域本身之间的耦合,但我想知道如果所有领域属性都没有公共设置器,我们如何从数据模型映射到领域模型,特别是如果存储库实现驻留在项目的基础设施部分中,因此我们无法使用内部属性设置器。
class DomainModel
{
string SomeProperty {get; private set:}
}
不正确
避免基础设施问题和领域本身之间的耦合。
正确
你可以使用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()));
如果你为每个对象都这样做,那么很快就会变得痛苦。但是,如果你遵循一些约定(或使用基本类型使其更容易),
那么你可以使用反射来自动地为域中的所有实体执行此操作。
祝你好运!