我是DDD的新手,我遇到了多对多的关系。例如。我们有两个聚合根 - 任务和工人。
合同绝对不是聚合根,因为没有Task和Worker就没有意义。所以,它应该是某些聚合的一部分。但它属于哪个聚合体?我们需要知道所有工作合同的汇总成本和所有工人合同的汇总成本。我很自然地在Task和Worker中收集合同。
好吧,我可以将费用计算转移到域名服务,但我担心这是贫血模型的一步。有没有通用的方法来处理多对多关系并保留覆盖域模型?
谢谢!
答案 0 :(得分:15)
通过关注侧边栏中链接的相关问题,我发现了这篇有趣的文章:
DDD & Many to Many Object Relational Mapping
似乎无论如何都建议我直觉地思考:对于工人和任务来说,依赖合同是不自然的。也就是说,“工人”的概念在没有“合同”概念的情况下仍然有意义(对于任务而言也是如此),因此体现该概念的实体不应该依赖于合同实体。
要显示分配给给定任务的合同或分配给给定工作人员的合同,您需要运行域查询。这实际上是域服务的合适用途,如果您考虑它,可以更好地反映您域名的实际情况。
我还注意到你说“合同绝对不是聚合根,因为没有任务和工作人员就没有意义”。这实际上是合约 聚合根的确切原因。
所以,我的建议,根据评论纳入了arootbeer的见解:
答案 1 :(得分:5)
Contract
在我看来是你设计中的一流对象。你声称它在worker
和task
的上下文之外没有意义,这当然是正确的,但这并不意味着它本身不是一个聚合根。
据推测,Contract
基于与其相关联的task
和worker
的某些属性,有自己的计算成本的逻辑。同样,有Task
和Worker
包含的与Contract
无关的上下文。
您需要跳转的差距是将相关上下文移动到Contract
对象中。让它存储worker
的费率和task
的句号(除了相应的ID,仅在上面隐式建模),并动态计算费用。
- 编辑 -
正如Domenic所述,您的评论是后续问题的良好候选人。但我会说,一旦您将Task
和Worker
ID添加到Contract
,报告就变成了一项微不足道的任务。