不同聚合的边界问题
Problem with boundry for different aggregates
我对聚合的边界有疑问。我试图阅读有关聚合、聚合根和边界的信息,寻找一些代码示例,但我仍然在努力。
我正在开发的应用程序是一个管理建筑项目的应用程序。
在应用程序的屏幕中,将有一个屏幕显示所选项目的所有详细信息,另一个屏幕显示所选构造函数的所有作业。
我有一个 AggregateRoot - ArchitectureProject
。它有一个 Architect
、Stages
等,它有一个 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,但我想在你的情况下,值对象可能非常适合。
我对聚合的边界有疑问。我试图阅读有关聚合、聚合根和边界的信息,寻找一些代码示例,但我仍然在努力。
我正在开发的应用程序是一个管理建筑项目的应用程序。 在应用程序的屏幕中,将有一个屏幕显示所选项目的所有详细信息,另一个屏幕显示所选构造函数的所有作业。
我有一个 AggregateRoot - ArchitectureProject
。它有一个 Architect
、Stages
等,它有一个 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,但我想在你的情况下,值对象可能非常适合。