Domain driven design 按ID检索实体引用其他聚合

Domain driven design 按ID检索实体引用其他聚合,domain-driven-design,aggregateroot,Domain Driven Design,Aggregateroot,一个聚合必须通过ID引用其他聚合,例如:order stores userId。因此,如果我需要用户实体在订单聚合中执行某些操作,我应该像这样传递它:order.doSomthing(user)。但是我应该在哪里检索应用程序服务或域服务中的用户呢?您没有。 聚合操作/依赖于它所拥有的数据。这不仅适用于写,也适用于读 如果一个聚合(例如用户需要来自另一个聚合(例如订单)的一些数据,那么应用程序服务(或者很可能是Saga/流程管理器)从订单获取数据,并将其传递给用户: user.doSomethin

一个聚合必须通过ID引用其他聚合,例如:order stores userId。因此,如果我需要用户实体在订单聚合中执行某些操作,我应该像这样传递它:order.doSomthing(user)。但是我应该在哪里检索应用程序服务或域服务中的用户呢?

您没有。

聚合操作/依赖于它所拥有的数据。这不仅适用于写,也适用于读

如果一个聚合(例如
用户
需要来自另一个聚合(例如
订单
)的一些数据,那么应用程序服务(或者很可能是Saga/流程管理器)从
订单
获取数据,并将其传递给
用户

user.doSomething(order.some, order.info)

你的意思是在用户应用程序服务中,我将拥有orderRepository来获取订单?例如:UserApplicationService{method(){orderId=user.orderId();order=orderRepository->findById(orderId);user.doSomething(order)}}@AgustinCastro no.用户不拥有订单。您将拥有类似于:
user.doSomething(order.some,order.info)
我知道了,但是如何检索订单呢?在下面的链接中:有一个家伙(David Masters)说:“那么,如果有涉及两个聚合的域逻辑,那么可以将其提取到一个域服务中,如下所示:”他从不同的存储库检索两个聚合,并执行agg1.DoSomething(agg2)@AgustinCastro您只需从存储库加载这两个聚合。关于这一联系:我不同意;这将在2个聚合之间创建一个非必要的耦合。因此我应该这样做:UserApplicationService{method(){orderId=user.orderId();order=orderRepository->findById(orderId);user.doSomething(order.some,order.info)}对吧?这太依赖于上下文了,无法给出一般的答案。提及域服务并从另一个聚合操作聚合也会提示设计问题。您应该更具体地说明
订单
在这里试图做什么。