在ddd中,实体可以引用相同聚合的实体或另一个聚合根(但不是另一个聚合中的实体)。
对于1.和2.我的问题是,实体不应该有权访问存储库。此外,魔术延迟加载机制并不总是可用,我认为应该避免出于同样的原因。因此,当存储库加载聚合时,是否应该由存储库解析其中每个实体的所有引用(并且所有引用的其他聚合都被加载)?或者是"参考"只是一个id和实体之外的人(commandhandler或者从存储库加载聚合并调用方法的人)使用这个id来加载另一个聚合并将其作为参数提供给方法,如下例所示? / p>
agg1 = repo1.Load(id);
agg2 = repo2.Load(agg1.refId);
agg1.mymethod(agg2);
对于3.我认为应该在另一个聚合上调用的唯一方法是查询方法(在cqs意义上),它们不会改变其他聚合,因为每个事务只应该更改一个聚合。正确?
答案 0 :(得分:2)
关于问题1.和2.你所说的很好,大部分时间都是这样做的。您可以在应用程序服务中通过ID引用其他聚合并在域逻辑之外检索它们。您不应在聚合中加载其他聚合的原因(SRP违规除外)是您无法控制正在发生的事情,与延迟加载相同。您可以轻松地制作代码,当它可以加载一次时,将从DB加载相同的聚合十二次。您可以使用缓存,但过时数据等也会出现问题。
然而,有时候,你需要做"性能驱动设计" over" DDD",然后你在另一个聚合中加载聚合,但很少见。
对于你的回答3.在CQRS的查询中,你甚至不使用存储库,也不使用聚合,因为你只想获取数据,那里不涉及域逻辑。