DDD中的多对多关系

问题描述

| 我是DDD的新手,而且我与多对多关系保持联系。例如。我们有两个聚合根-任务和工作者。 合同绝对不是总根,因为没有Task和Worker毫无意义。因此,它应该是某些集合的一部分。但是它应该属于哪个集合?我们需要知道所有任务合同的汇总成本和所有工人合同的汇总成本。对我来说,在Task和Worker中同时收取合同是很自然的。 好吧,我可以将“成本计算”移至域服务,但是我担心这是向贫血模型迈出的一步。有通用的方法来处理多对多关系并保留到达域模型吗? 谢谢!     

解决方法

通过关注侧边栏中链接的相关问题,我发现了这篇有趣的文章: DDD和多对多对象关系映射 无论如何,似乎还是建议我直觉上的想法:工人和任务依赖合同实际上是不自然的。也就是说,“工人”的概念在没有“合同”概念的情况下仍然有意义(和任务类似),因此,体现该概念的实体不应依赖于合同实体。 要显示分配给给定任务的合同或分配给给定工作人员的合同,您将需要运行域查询。实际上,这是域服务的适当用法,并且如果您考虑过它,则可以更好地反映域的实际情况。 我还注意到您说“合同绝对不是聚合根,因为没有Task和Worker没有意义。”这实际上就是合同是聚合根的确切原因。 因此,根据我的建议,我对arootbeer的评论有所了解:     ,在我看来,
Contract
是您设计中的一流对象。您声称在ѭ1和ѭ2的上下文之外都没有道理的说法当然是正确的,但这并不意味着它本身并不是合计根。
Contract
基于与
task
worker
相关的属性来计算其成本具有自己的逻辑。类似地,存在上下文“ 6”和“ 7”包含与“ 0”无关的内容。 您需要跳过的空白是将相关上下文移动到“ 0”对象中。让它存储ѭ1的汇率和ѭ2的周期(除了各自的ID(上面仅隐式建模)之外),并动态地计算成本。 - 编辑 - 正如Domenic所说,您的评论非常适合跟进后续问题。但是我要说的是,一旦您将
Task
Worker
ID放入
Contract
,报告就变得微不足道了。