Domain driven design 在ddd中,所有呼叫是否应通过聚合根路由?

Domain driven design 在ddd中,所有呼叫是否应通过聚合根路由?,domain-driven-design,Domain Driven Design,想要对聚合进行操作的“用户/开发人员”应该只面对聚合根吗?那么,我想调用的每个方法是否都应该通过根“路由”到聚合中的一个实体上呢?这将使root拥有一个非常广泛的接口,其中包含大量枯燥的代码 或者允许它遍历和导航聚合,选择要处理的实体并直接在其上调用方法 或者我必须要求根用户给我实体(不允许从外部遍历和导航聚合),然后直接调用此实体上的方法?指定为聚合“根”的实体是网关守护者,因此所有方法调用都需要首先经过他。如果你仔细想想,这是有道理的。如果你分发了一个内部实体,你怎么能确定它是以预期的方式使

想要对聚合进行操作的“用户/开发人员”应该只面对聚合根吗?那么,我想调用的每个方法是否都应该通过根“路由”到聚合中的一个实体上呢?这将使root拥有一个非常广泛的接口,其中包含大量枯燥的代码

或者允许它遍历和导航聚合,选择要处理的实体并直接在其上调用方法


或者我必须要求根用户给我实体(不允许从外部遍历和导航聚合),然后直接调用此实体上的方法?

指定为聚合“根”的实体是网关守护者,因此所有方法调用都需要首先经过他。如果你仔细想想,这是有道理的。如果你分发了一个内部实体,你怎么能确定它是以预期的方式使用的,并且不变量得到了支持?此外,现在您的内部细节已经耦合,进行内部结构更改将波及整个系统


请记住,我们努力设计小骨料,因此,如果表面积变得太大,这可能表明您的骨料边界是错误的。

回答得好。我不知道在哪里,但我记得读过一篇文章,如果内部实体使用的时间很短,那么分发它们(通过聚合根)是可以的。这将只耦合实体,而不是内部结构(如何获取实体)。你会说这是可以的,还是严格要求除根之外的所有实体都是不可见的,外部不知道的?那么价值对象呢?我认为它们可以用作参数和返回值,对吗?是的,分发瞬态引用是完全正确的。因为值对象是不可变的,所以接受/返回它们也是完全可以接受的。事实上,它们是域的一部分,因此聚合上的方法应该接受大多数情况。@HolgerThiemann如果实际导航到聚合的内部实体并在不通知根的情况下直接调用该实体上的方法是有意义的,那么该实体很可能是它自己的聚合根。