DDD - 聚合root是否正常?

时间:2017-07-12 22:48:07

标签: domain-driven-design aggregateroot

我的聚合根可以作为他管理的实体的工厂吗?

E.G:我的聚合根“问题”可以实例化一个实体“回答”吗?

2 个答案:

答案 0 :(得分:3)

  

我的聚合根可以作为他管理的实体的工厂吗?

几乎。

聚合根不是实体,而是实体所扮演的角色。思考界面 - 它为应用程序提供了对域模型的限制访问,封装了实际的实现。

让聚合对自己的状态负责是很自然的;毕竟,聚合的所有组件都将从相同的数据模型中提取(它们一起存在)。

在您的实体(充当聚合根)中,您希望代码尽可能与域语言保持一致。这通常意味着您没有“工厂”,如在设计模式中,而是在模型中有一些实体来生成管理实体。

当他写Don't Create Aggregate Roots时,Udi Dahan有点倾斜地谈到了这一点。

  

客户不仅仅是凭空出现。

模型中的实体都来自模型中的其他实体。乌龟一路下来。

因此,将工厂设计模式引入领域语言有点草图。

因为域模型存在于内存中......因为域模型具有副作用的不寻常......抽象连接点的许多通常动机都不适用。例如,如果您发现自己想要将模拟注入您的域模型以进行单元测试,则会出现严重错误(进入域服务,是的,但不是实体)。

答案 1 :(得分:1)

是的,如果代码是简单的new Answer (someArguments, ...),那就是。

如果这是一个更复杂的过程,那么您应该将此代码提取到AnswerFactory类。

编辑: 创建一个干净的代码的愿望决定了这一点,而不是DDD。来自DDD的与您的问题相关的规则是Domain(因此Domain层中的所有类)不应依赖于任何其他层(如Infrastructure或Application)。