我的聚合根可以作为他管理的实体的工厂吗?
E.G:我的聚合根“问题”可以实例化一个实体“回答”吗?
答案 0 :(得分:3)
我的聚合根可以作为他管理的实体的工厂吗?
几乎。
聚合根不是实体,而是实体所扮演的角色。思考界面 - 它为应用程序提供了对域模型的限制访问,封装了实际的实现。
让聚合对自己的状态负责是很自然的;毕竟,聚合的所有组件都将从相同的数据模型中提取(它们一起存在)。
在您的实体(充当聚合根)中,您希望代码尽可能与域语言保持一致。这通常意味着您没有“工厂”,如在设计模式中,而是在模型中有一些实体来生成管理实体。
当他写Don't Create Aggregate Roots时,Udi Dahan有点倾斜地谈到了这一点。客户不仅仅是凭空出现。
模型中的实体都来自模型中的其他实体。乌龟一路下来。
因此,将工厂设计模式引入领域语言有点草图。
因为域模型存在于内存中......因为域模型具有副作用的不寻常......抽象连接点的许多通常动机都不适用。例如,如果您发现自己想要将模拟注入您的域模型以进行单元测试,则会出现严重错误(进入域服务,是的,但不是实体)。
答案 1 :(得分:1)
是的,如果代码是简单的new Answer (someArguments, ...)
,那就是。
如果这是一个更复杂的过程,那么您应该将此代码提取到AnswerFactory
类。
编辑: 创建一个干净的代码的愿望决定了这一点,而不是DDD。来自DDD的与您的问题相关的规则是Domain(因此Domain层中的所有类)不应依赖于任何其他层(如Infrastructure或Application)。