parent-child Axon Framework 中如何管理聚合关系

How are parent-child aggregate relationships managed in Axon Framework

来自 parent 的 Axon 文档 describes how to create a child aggregate,但不是如何检索或删除它(例如级联删除)

parent 聚合 typically-explicitly 或 automatically-internally 是否保留对 child 聚合的引用列表? 此类引用是否是聚合 ID 的集合,或者,更面向 object,是对 child 聚合的实际实例引用的集合?

提出这个问题的另一种方式:child 聚合体与 multi-entity 聚合体中的实体有何不同,child 聚合体与完全独立的聚合体有何不同?

我想要 parent 和 child 之间的级联删除(包含)模型,但我想要单独并发访问非常大的 child object集合,因此聚合成员实体不是 suitable.

另请注意 a similar question in the forum:OP,Jakob 在最后描述了一个模型,其中包括他自己的 table 管理级联引用...我需要那个吗?

如果您要求实体是单独的聚合,那么您将需要维护从 parent 到 child 的引用 table。

Axon 提供的从 parent 聚合创建 child 聚合的支持是为了确保框架使用单个事务来发布多个事件。 Axon Framework 绝不会自动为您存储关系。

相反,所有这些都应该在聚合的事件流中已知。考虑到这一点,结合事件溯源,您可以在聚合中获取任何形式的数据。

回到你的级联删除场景:我实际上已经就此事与 Jakob 直接联系。在他的情况下(可能还有你的情况),我们最终得到了一个 `aggregateId-to-childAggregateIds 模型,专门用于保存引用。从 parent 聚合(在任何级别)中删除时,将引用此模型,确保也删除正确的 children 集。请注意,所有这些都是自定义代码。

此外,这个 aggregateId-to-childAggregateIds 模型可以被视为您的命令模型的一部分(前提是您的目标是应用 CQRS)。因此,它纯粹用于驱动 decision-making。在这种情况下,decision-making 决定向 children 发送删除命令。

所以,总结一下:

  • Axon 不会为您保留 parent-child 关系,除了在您发布的活动内容中。
  • 我会选择 aggregateId-to-childAggregateIds 模型 从不 存储整个聚合实例。您根本不需要所有数据来决定删除谁。 child 的聚合标识符应该足够了。
  • Axon 的 child 聚合创建支持纯粹是为了使用针对事件存储的单个事务来发布 parent 的更改和 child 的创建,同时仍然受益于单独的实例以提高并发性。 Axon 的聚合成员支持会将 children 标记为 parent 聚合根下的实体,而不是它们自己的聚合实例。