【问题标题】:How are parent-child aggregate relationships managed in Axon FrameworkAxon Framework 中如何管理父子聚合关系
【发布时间】:2022-01-24 18:56:22
【问题描述】:

来自父级的 Axon 文档 describes how to create a child aggregate,但没有说明如何检索或删除它(例如,用于级联删除)

父聚合通常是显式地还是自动在内部保留对子聚合的引用列表? 这样的引用会是聚合 ID 的集合,还是更面向对象的对子聚合的实际实例引用的集合?

提出这个问题的另一种方式:子聚合与多实体聚合中的实体有什么不同,子聚合与完全独立的聚合有什么不同?

我想要父子对象之间的级联删除(包含)模型,但我想要单独并发访问一个非常大的集合中的子对象,因此不适合聚合成员实体。

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

【问题讨论】:

    标签: axon


    【解决方案1】:

    如果您要求实体是单独的聚合,那么您将需要维护一个从父级到子级的引用表。

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

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

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

    此外,这个aggregateId-to-childAggregateIds 模型可以被视为您的命令模型的一部分(假设您的目标是应用 CQRS)。因此,它纯粹用于推动决策。在这种情况下,决策是决定向正确的孩子发送删除命令。

    所以,总结一下:

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

    【讨论】:

      猜你喜欢
      • 2019-12-19
      • 1970-01-01
      • 1970-01-01
      • 2019-10-09
      • 2010-10-28
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多