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

ziG*_*iGi 5 entity domain-driven-design

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

afh*_*afh 5

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

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

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