DDD:我需要多少聚合根?

DDD: How many Aggregate roots do I need?

我对 DDD 中的聚合根概念有点困惑。理论告诉它应该是与当前操作相关的聚合根。

比如我有一个root Account,代表一个公司。它具有地址、属于该帐户的用户以及一些其他属性。

我有好几页;一种是管理一般信息,例如姓名、电子邮件、phone... 另一个是维护地址。 还有一个显示所有用户(和编辑用户信息,这可能也在帐户对象下)

第一种情况我不关心地址,第二种我不关心姓名、电子邮件....

我需要两个单独的帐户对象还是只需要一个帐户? (模型可能比我描述的更复杂)

因此,例如,我可能会得到 classes: BasicAccountInformation, AccountAddress, AccountUsers.... 或者只是一个:包含所有数据的帐户?

正确的 DDD 方法是什么?我认为,在一种情况下,我会得到一个非常复杂的 class,其中包含很多属性和逻辑;或许多简单的 classes,每个 class.

具有 2-10 个属性

How many Aggregate roots do I need?

至少一个。

聚合作为一致性边界。如果您将整个域建模为单个聚合,并提供一个 "aggregate root" 来确保每次写入都维护您的业务不变性,那么您就可以开始了。

嗯,你慢慢来就好了。聚合根充当聚合边界中所有状态的一种序列化瓶颈。如果您希望更新模型的两个不同部分 "at the same time",那么您将需要划分业务不变量的责任。

And I have two pages; one is to manage general information, such as name, email, phone... Another is to maintain Address.

报告很棒。他们会告诉您需要为您的模型收集哪些数据。

但是报告很难告诉您聚合的位置 - 聚合的主要关注点不是 reading/presenting/reporting 您的数据,而是写入数据。

在执行 write 时,您可以通过查找模型中需要组合在一起的数据来找到聚合。您需要哪些数据来执行业务不变性?

这种启发式方法往往会吸收 CRUD 域,因为模型的大部分状态都独立于其余部分。

你可以看看实体关系;如果两个聚合 "share" 一个实体,那么该实体可能属于第三个聚合。

您可以查看的另一件事是实体生命周期。如果一个子实体可以比聚合根活得更久,那么你就知道你建模错误了。

根据你的描述,这对这里也没有太大帮助;您已经有效地获得了帐户,以及其中的一堆东西。

有时所有这些都失败了,您最终会使用启发式方法 "which data do I only want to load once in a while",您只需将其添加到键值存储中,然后返回交付业务价值。