Domain driven design DDD:关于两个实体的逻辑应该放在哪里?

Domain driven design DDD:关于两个实体的逻辑应该放在哪里?,domain-driven-design,entity,Domain Driven Design,Entity,我有以下用例。我有一张发票,上面有行和联系人。我想知道与检查是否所有信息都存在(即至少有一行,并且联系人存在)相关的逻辑是否应该存在?我认为,在这种情况下,可以将逻辑放在聚合中的最佳位置是发票。聚合处理与线路和触点相关的逻辑。联系人不应耦合到发票,行也不应知道发票,因为它们本身就是一个实体列表。如果发票是您的聚合根,那么它应该是确保一切正确的地方。当然,将验证委托给它的实体或值对象(线、触点等)来验证它们自己的数据和不变量是有意义的。但是聚合是一个逻辑边界,它确保域模型不会进入无效状态,并且如果

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

我认为,在这种情况下,可以将逻辑放在聚合中的最佳位置是发票。聚合处理与线路和触点相关的逻辑。联系人不应耦合到发票,行也不应知道发票,因为它们本身就是一个实体列表。

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

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

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