DDD:我应该把关于两个实体的逻辑放在哪里?

DDD: Where should I put logic concerning two entities?

我有以下用例。我有一张包含行和联系人的发票。我想知道与检查是否存在所有信息(即至少一行,并且联系人存在)相关的逻辑是否应该存在?

我认为您可以放置​​逻辑的最佳位置是聚合,在这种情况下就是您的发票。聚合处理与线路和联系人相关的逻辑。联系人不应与发票相关联,并且行不应知道发票,因为它们是独立的实体列表。

如果发票是您的聚合根,那么它应该是确保一切正确的地方。将验证委托给它的实体或值对象(线路、联系人等)以验证它们自己的数据和不变量当然是有意义的。但是聚合是逻辑边界,它确保你的域模型不会进入无效状态并且如果需要调用其子项(实体和值对象)的方法,还将编排逻辑流。

这也是为什么您不应该直接访问聚合的子实体而应该只通过聚合本身的 API 来执行操纵状态的业务操作的原因。

如果您所指的业务逻辑需要跨多个聚合实例(即它跨越多个发票),您应该将该逻辑提取到一个领域服务专用于业务逻辑不受限于单个聚合实例的情况。