1

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

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

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

谢谢

4

2 回答 2

4

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

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

于 2013-01-23T22:24:16.483 回答
2

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

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

相反,您可以决定,在大多数情况下,您将让外部对象获得对内部实体的临时引用,并根据需要操作它们。在极少数情况下,尤其是那些意味着强制跨多个实体的不变量的情况下,直接在根上实现这些操作会是一个更好的主意。

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

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

总体而言,最终决定将取决于您是想主要考虑域/功能内聚性来设计聚合,还是首先要将它们视为事务保障。

于 2013-01-24T10:01:03.593 回答