DDD中的多对多关系

时间:2011-04-27 14:54:24

标签: c# domain-driven-design

我是DDD的新手,我遇到了多对多的关系。例如。我们有两个聚合根 - 任务和工人。

合同绝对不是聚合根,因为没有Task和Worker就没有意义。所以,它应该是某些聚合的一部分。但它属于哪个聚合体?我们需要知道所有工作合同的汇总成本和所有工人合同的汇总成本。我很自然地在Task和Worker中收集合同。

好吧,我可以将费用计算转移到域名服务,但我担心这是贫血模型的一步。有没有通用的方法来处理多对多关系并保留覆盖域模型?

谢谢!

Class diagram

2 个答案:

答案 0 :(得分:15)

通过关注侧边栏中链接的相关问题,我发现了这篇有趣的文章:

DDD & Many to Many Object Relational Mapping

似乎无论如何都建议我直觉地思考:对于工人和任务来说,依赖合同是不自然的。也就是说,“工人”的概念在没有“合同”概念的情况下仍然有意义(对于任务而言也是如此),因此体现该概念的实体不应该依赖于合同实体。

要显示分配给给定任务的合同或分配给给定工作人员的合同,您需要运行域查询。这实际上是域服务的合适用途,如果您考虑它,可以更好地反映您域名的实际情况。

我还注意到你说“合同绝对不是聚合根,因为没有任务和工作人员就没有意义”。这实际上是合约 聚合根的确切原因。

所以,我的建议,根据评论纳入了arootbeer的见解: Proposed new class diagram

答案 1 :(得分:5)

Contract在我看来是你设计中的一流对象。你声称它在workertask的上下文之外没有意义,这当然是正确的,但这并不意味着它本身不是一个聚合根。

据推测,Contract基于与其相关联的taskworker的某些属性,有自己的计算成本的逻辑。同样,有TaskWorker包含的与Contract无关的上下文。

您需要跳转的差距是将相关上下文移动到Contract对象中。让它存储worker的费率和task的句号(除了相应的ID,仅在上面隐式建模),并动态计算费用。

- 编辑 -

正如Domenic所述,您的评论是后续问题的良好候选人。但我会说,一旦您将TaskWorker ID添加到Contract,报告就变成了一项微不足道的任务。