聚合中的实体能否移动到 Axon 中的另一个聚合(相同类型)

can an entity within an aggregate move to another aggregate (same type) in Axon

假设我们有一个聚合 class A 并且有实体 class B 和实体 class C,使用事件源和 AggregateMember with ForwardMatchingInstances。

创建了 2 个聚合 A,id 为 aId1 和 aId2。

我们发送一条命令,将class B的新实体添加到aId1,id为bId1

我们发送一条命令,将 class B 的新实体添加到 aId1,id 为 bId2


现在出于某种原因,我们希望将其中一个实体移动到另一个聚合,因为业务逻辑具有针对类型 B 的实体的特定逻辑(对于 C 也是如此)。


轴突能支持吗? -> 我们能否在不更改 bId1 的情况下将实体 bId1 移动到聚合 aId2(保持相同的 ID,只是聚合的移动)。

为此,我会使用 saga 来确保:


本应发送至 aId1 并对 bId1 执行操作的待处理命令会发生什么情况? (异常不再存在?)

更改后 bId1 的新命令是否发送到聚合 aId2(bId1 现在在聚合 aId2 中,具有相同的实体 ID)?

我认为唯一的答案是:

Can axon support that? -> Can we move entity bId1 to aggregate aId2 without changing bId1 (keep same id, just move of aggregate).

带NO。这不是因为 Axon,而是因为 CQRS 和事件溯源。您不想在其中发出包含实体状态的事件。 您唯一拥有的是 "what happened" 的总和。您需要做的是找出 "move" 在商业上的真正含义。

在实现方面,您通常会将其视为添加和删除(无论顺序如何)。如果操作失败(可能 add 无效),您将需要能够对失败进行补偿。如果经常预期失败,那么是的,"reserve-and-confirm" 方法会比 "try-and-compensate" 方法更好。

在 Axon 中,您可以使用 Saga 或只使用控制器。在后一种情况下,您只需发送一条命令,然后根据结果发送第二条命令。当第二个命令returns失败时,可以补偿第一个

请注意,命令永远不会 "sent to entities"。它们将根据 @TargetAggregateIdentifier 注释字段(或您配置的 CommandTargetResolver 可能使用的任何方法)发送到聚合。该字段定义加载哪个聚合实例。然后,一旦聚合被加载,Axon 将定义聚合中的哪个实体定义处理程序来实际处理命令。

最后评论:通常,这些情况取决于很多特定领域的细节。如果没有关于您正在构建它的领域或案例的任何信息,很难明智地回答这样的问题。