在 Eric Evan 的领域驱动设计 ( http://domaindrivendesign.org/index.htm ) 中,您应该首先考虑您的聚合。然后,您围绕这些构建存储库。
有许多技术可用于处理彼此相关的聚合。我最常使用的是只允许聚合通过只读接口相互关联。Aggregates 背后的关键思想之一是,如果不通过根,就无法更改底层对象的状态。因此,如果产品和用户是模型中的根聚合,那么如果我通过用户->订单->产品得到它,我将无法更新产品。我必须从产品存储库中获取产品才能对其进行编辑。(从 UI 的角度来看,您可以使它看起来像用户->订单->产品,但是当您点击产品编辑屏幕时,您会从产品存储库中获取实体)。
当您通过从用户->订单->产品查看产品(在代码中)时,您应该查看的产品界面没有任何方法可以更改产品的底层状态(只有没有集合等。 )
根据您使用它们的方式来组织您的聚合和存储库。我可以看到 User 和 Prodcut 是他们自己的聚合并拥有自己的存储库。根据您的描述,我不确定 Order 是否应该属于 User 或者也应该是独立的。
当聚合相关时,无论哪种方式都使用只读接口。当您必须从一个聚合跨越到另一个聚合时,请从其自己的存储库中获取它。
如果您的存储库正在缓存,那么当您(通过用户)加载订单时,只需从数据库中加载产品 ID。然后使用产品 ID 从产品存储库加载详细信息。您可以通过在加载订单时在产品上加载任何其他不变量来进行一些优化。