我研究的许多DDD教程都涵盖了理论。它们都有基本的代码示例(Pluralsight和类似代码)。
在网络上,也有人尝试创建涵盖EF的DDD的教程。如果您只是简短地学习它们-您很快就会发现它们彼此之间有很大的不同。有些人建议保持应用程序最小化,并避免在EF之上引入其他层(例如,存储库),其他人则决定生成额外的层,甚至通过注入DbContext
聚合根甚至违反SRP 。
如果要提出基于意见的问题,我深表歉意,但是...
在实践中,实体框架是功能最强大且使用最广泛的ORM之一。不幸的是,您不会找到涵盖DDD的综合课程。
重要方面:
实体框架可立即使用UoW和存储库(
DbSet
)使用EF,您的模型具有导航属性
与EF所有的车型都始终可用的关闭
DbContext
(它们被表示为DbSet
)
陷阱:
您不能保证子模型仅受“聚合根”影响-您的模型具有导航属性,可以修改它们并调用
dbContext.SaveChanges()
与
DbContext
您可以访问每一个模型,从而规避聚合根您可以通过将
ModelBuilder
in 标记为字段来通过inOnModelCreating
方法来限制对根对象的子对象的访问-我仍然不认为这是进行DDD的正确方法,而且很难评估这种情况将来可能导致什么样的冒险(非常怀疑)
冲突:
如果没有实现返回聚合的另一层存储库,我们甚至无法部分解决上述陷阱
通过实现额外的存储库层,我们将忽略EF的内置功能(每个
DbSet
都已经是仓库)并且使应用程序过于复杂
我的结论是:
请原谅我的无知,但基于以上信息-要么是实体框架 不足以用于域驱动设计,或者域驱动设计是不完善且过时的方法。
我怀疑每种方法都有其优点,但是我现在已经完全迷失了,对如何将EF与DDD调和一无所知。
如果我错了-请问至少有人能详细介绍一下如何使用EF进行DDD的简单说明(甚至提供不错的代码示例)吗?