不同聚合的边界问题

Problem with boundry for different aggregates

我对聚合的边界有疑问。我试图阅读有关聚合、聚合根和边界的信息,寻找一些代码示例,但我仍然在努力。

我正在开发的应用程序是一个管理建筑项目的应用程序。 在应用程序的屏幕中,将有一个屏幕显示所选项目的所有详细信息,另一个屏幕显示所选构造函数的所有作业。

我有一个 AggregateRoot - ArchitectureProject。它有一个 ArchitectStages 等,它有一个 ConstructorJobs 的列表(因为它必须是在带有项目详细信息的屏幕上)。 ConstructorJob 有它的名字、一些值和一个 Constructor。一个 Constructor 可以有一些 ConstructorType。对于我来说,Constructor 是另一个 AggregateRoot。我对 ConstructorJob 有疑问。我应该把它放在哪里?应该由什么负责管理?

我试图用什么来区分什么不能存在,而 ConstructorJob 没有 Project 就不能存在,但另一方面它也必须有 Constructor... 我无法想象 Constructor 会属于 Project 聚合,因为 ConstructorType 会是 id 的第 4 级子级,因此搜索该类型的所有构造函数会很痛苦,不会是?

如有任何解释,如何处理此类情况,我将不胜感激。

我认为您遗漏了一条重要的规则,它通常会让您的生活变得更轻松:

Rule: Reference Other Aggregates by Identity

另请参阅 Vaughn Vernon 的书 Implementing Domain-Driven Design,第 10 章 - 聚合。

重要的是要注意,如果存在一个聚合没有另一个是有意义的。它更多的是关于 交易边界。因此,聚合应该在元素周围创建一个边界,这些元素只能在同一事务中一起更改 - 遵守一致性.

所以我想,你会在不同的用例中更改你的 Project 你会更改 Constructor - 我想这可能是在不同项目中引用。

这意味着您应该仅通过 id 引用聚合内的其他聚合,这避免了对具有深层层次结构的庞大聚合进行建模。这也意味着,如果您的聚合会随着时间的推移而变大,那么您可能会错过一些您最初建模为实体的新聚合,并且它本身应该是一个聚合。

As for me, Constructor is another AggregateRoot. I have a problem with ConstructorJob. Where should I place it? What should be responsible for managing it?

对于你的情况,我将按以下方式建模:

ConstructorJob是一个值对象 它包含一些数据(名称等)以及对 构造函数聚合 的引用。但是此引用不是 对象引用 方面的引用,就像您对聚合根的子实体所做的那样。构造函数聚合由 ConstructorJob 中的 identifier(UUID、整数或您用作 id 类型的任何类型)引用。

ConstructorJob 值对象将成为 Project 聚合 的一部分。项目聚合当然可以直接保存构造函数聚合的 id,但我想在你的情况下,值对象可能非常适合。