DDD 聚合与实体

问题描述

如何处理具有两个依赖项的对象:

假设我们有三个对象:客户、公司和合同。 合同需要客户和公司才能存在。

当然,从商业角度来看,合同更多地属于客户而不是公司,但是公司将合同提供给客户。

现在,我将所有三个作为单独的聚合根。因为您也应该能够快速查询特定公司的现有合同。如果合同是客户聚合根下的实体,我需要查询所有拥有 X 公司合同的客户,然后返回这些合同的扁平列表。哪个看起来有点奇怪?

其次,合约本身有很多实体,下面还有更多实体。

以简单的方式解释层次结构:

合约聚合包含实体 A 的列表,实体 A 有实体 B 的多个项目,实体 B 有实体 C 的多个项目。所以它是一个深层结构,所有这些都必须通过它上面的聚合公开。>

如果我将合约聚合根作为一个实体放在客户端之下,我的客户端聚合也需要为合约下面的内容携带所有这些额外的方法。很快我就会把几乎所有的东西都放在同一个聚合下。

所以我的问题是:我可以问自己哪些问题来回答此类问题?可能没有对错之分,但应该有一些关于如何处理这样的问题的指南?

谢谢!

解决方法

我可以问自己哪些问题来回答此类问题?

Eric Evans 是如何定义 AGGREGATE 的

聚合是一组相关联的对象,我们将其视为一个单元,以便进行数据更改。

“改变”是这里的重要思想;在设计聚合边界时,我们并不特别关心出现在同一个报告(只读视图)中的数据,我们关心的是在进行更改时需要考虑哪些数据。

另见Mauro Servienti: All our aggregates are wrong.