整体聚合根

Monolithic aggregate roots

我们如何处理下面有大量聚合的聚合根?

假设我有一个 Person 作为我的聚合根,并且有大量实体代表一个人可以做的所有各种活动和事情。这些中的每一个都明显彼此分开并具有自己的生命周期并且可以存储在不同的数据库中。它们都依赖于 Person 的生命周期,但是,如果 Person 被删除,它们也都需要被删除,因为它们不再相关。

如果 Person 是所有这些对象的聚合根,我如何避免拥有试图覆盖所有这些对象的庞大存储库?

如果这些东西中的每一个都是它们自己的聚合根,可以有自己的存储库,我会处理整个问题,如果 Person 被删除,确保级联删除?

"Ownership" 并不一定意味着聚合。

例如,一个 Customer "owns" 一个或多个 Order 实例,但这些实例不属于 Customer 聚合,因为它们有自己的生命周期。

您的数据库技术可以强制执行级联删除,尽管那是另一个讨论。人们可能很少需要或不想从数据库中删除实例。停用 Customer 可能是更可行的方法。在处理审计 and/or 立法等需要将数据存储最短时间的情况下,这更是一个问题。存档是另一种选择。

AnAggregate Root 提供了一种方法来控制对 Domain 中实体的访问。这并不一定意味着您应该始终拥有一个聚合根。什么应该是聚合根应该来自您的业务需求是什么,而不一定是它们在数据库中的存储方式。

如果更新域的一部分会对域的另一部分产生影响。那么,Domain Events可以提供帮助。

来自Microsoft Docs领域的事件定义如下:

A domain event is something that happened in the domain that you want other parts of the same domain (in-process) to be aware of. The notified parts usually react somehow to the events.

由于领域事件在内存中,您可以在生命周期结束时提交或回滚 "the entire transaction"。

就是说,如果它不适合您的用例,您不应该创建额外的聚合根,因为它体积庞大。如果出于所有正确的原因聚合根很大,您可以使用特定于语言的功能来划分聚合根。例如,在C#中我们有partial class的概念。您可能会创建多个 partial Person 类 并将操作分成不同的文件(如果使用 C#)。