我是DDD的新手,我被多对多的关系所困扰。例如,我们有两个聚合根- Tasks和Workers。
Contract绝对不是聚合根,因为如果没有Task和Worker,它就没有意义。因此,它应该是某个聚合的一部分。但是它应该属于哪个聚合呢?我们需要知道所有任务合同的汇总成本和所有员工合同的汇总成本。对我来说,在Task和Worker中都有合同集合是很自然的。
好吧,我可以将成本计算转移到域服务,但我担心这是向贫血模型迈出的一步。是否有处理多对多关系和保留reach域模型的通用方法?
谢谢!
发布于 2011-04-27 23:01:22
通过关注侧栏中链接的相关问题,我发现了这篇有趣的文章:
DDD & Many to Many Object Relational Mapping
它似乎推荐了我直觉上的想法:工人和任务实际上并不自然地依赖于合同。也就是说,在没有“契约”概念的情况下,“工作者”的概念仍然有意义(对于任务也是如此),因此包含该概念的实体不应该依赖于契约实体。
要显示分配给给定任务的合同或分配给给定员工的合同,您需要运行域查询。这实际上是对域服务的一种适当的使用,如果您仔细考虑一下,它会更好地反映您的域的实际情况。
我还注意到您说"Contract绝对不是聚合根,因为没有Task和Worker它就没有意义。“这实际上就是契约被为聚合根的确切原因。
因此,我的建议,结合arootbeer从评论中获得的见解:
发布于 2011-04-27 23:10:25
在我看来,Contract
在您的设计中是一流的对象。您声称它在worker
和task
的上下文之外都没有意义,这当然是正确的,但这并不意味着它本身就不是聚合根。
根据与之相关的task
和worker
的某些属性,Contract
大概有自己的计算成本的逻辑。类似地,Task
和Worker
包含与Contract
无关的上下文。
您需要跳过的间隙是将与相关的上下文移动到Contract
对象中。让它存储worker
的速率和task
的周期(除了上面仅隐式建模的相应it之外),并动态地计算成本。
-编辑--
正如Domenic所说,你的评论是一个很好的后续问题的候选者。但我要说的是,一旦您将Task
和Worker
I添加到Contract
上,报告就变成了一项微不足道的任务。
https://stackoverflow.com/questions/5806120
复制相似问题