外部对象是否应该通过调用...来对内部实体执行操作?

时间:2013-01-23 20:38:33

标签: domain-driven-design

1) a)聚合中的实体只能通过聚合根访问。虽然 root 可以将对内部实体的瞬态引用传递给外部对象(在单个操作期间),但我认为在大多数情况下,如果外部对象需要对内部实体执行某些操作,它应该调用聚合根上定义的方法(设计)例如 - Order.SetOrderLineTitle(...))?

2)只能直接获得 AGGREGATE roots 。必须通过遍历关联找到所有其他对象。

a)当我们说外部对象应通过遍历关联访问非根实体时,我们是否应该调用方法on 聚合根(例如Order.SetOrderLineTitle(...)),它反过来会对内部对象执行操作,或者我们是指聚合根应该将对内部实体的引用传递给外部对象或两者?

谢谢

2 个答案:

答案 0 :(得分:4)

1)是的,这是聚合物保持其完整性的最佳方式。有人说这会导致聚合的方法数量非常多,但在这种情况下可能会有多个聚合。

2)理想情况下,聚合将执行所需的操作而不传递引用。可能存在传递引用有意义的情况,但这应该谨慎实施,因为它使完整性的推理变得更加困难。

答案 1 :(得分:2)

  

在大多数情况下,我假设外部对象需要执行某些操作   对内部实体的操作,应该调用在上面定义的方法   聚合根

只是对此添加略有不同的看法,也可以使用反向方法。在大多数情况下将方法添加到聚合根 会强制您将域划分为非常小的聚合,以免根源变得臃肿,从而违反SRP。这种切割可能会牺牲您的聚合体的自然业务凝聚力。

相反,你可以决定在大多数情况下你会让外部对象获得对内部实体的瞬态引用并按照自己的意愿操纵它们。 在极少数情况下,特别是那些暗示强制执行跨越多个实体的不变量的情况,最好直接在Root上实现这些操作。

这里讨论的方法是:https://groups.google.com/forum/#!topic/dddcqrs/mtGanS39XYo

  

我看到它的方式虽然聚合根负责   内部实体的生命周期,并不意味着它应该是   独占接口(除了返回特定实体)到所有人   调用聚合中任何项目的方法。

总的来说,最终的决定取决于您是否要在设计聚合时主要考虑域/功能的凝聚力,或者您首先要将它们视为事务性保护措施。