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

Java 聚合中的实体能否移动到Axon中的另一个聚合(相同类型),java,events,cqrs,axon,Java,Events,Cqrs,Axon,假设我们有一个聚合类A,有实体类B和实体类C,使用事件源和AggregateMember以及ForwardMatchingInstances 创建了2个聚合A,id为aId1和aId2 我们发送一个命令,向aId1添加一个新的B类实体,id为bId1 我们发送一个命令,向aId1添加一个新的B类实体,id为bId2 现在出于某种原因,我们希望将其中一个实体移动到另一个聚合,因为业务逻辑有一个针对类型B的实体的特定逻辑(与C相同) axon能支持吗?->我们是否可以在不更改bId1的情况下将实

假设我们有一个聚合类A,有实体类B和实体类C,使用事件源和AggregateMember以及ForwardMatchingInstances

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

我们发送一个命令,向aId1添加一个新的B类实体,id为bId1

我们发送一个命令,向aId1添加一个新的B类实体,id为bId2


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


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

要做到这一点,我将用一个传奇故事来确保:

  • 首先检查bId1是否可以移动到aId2,将发出一个事件(如ReservedxxEvent)
  • Saga向aId1发送命令以从aId1中删除bId1,aId1发出一个事件
  • Saga等待事件,然后向aId2发送命令以添加bId1,aId2发出一个事件,然后Saga结束

对于应该转到aId1并对bId1执行操作的挂起命令,会发生什么情况?(例外情况是不再存在了?)


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

我认为回答这个问题的唯一方法是:

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

不是因为Axon,而是因为CQR和事件来源。您不希望发出包含其中实体状态的事件。 你所拥有的唯一东西就是你的集合“发生了什么”的痕迹。你需要做的是,从商业角度找出“移动”的真正含义

在实现方面,您通常会将其视为添加和删除(以任意顺序)。如果操作失败(可能add无效),您需要能够补偿失败。如果故障是经常发生的,那么是的,“保留并确认”方法比“尝试并补偿”方法要好

在Axon中,您可以使用传奇故事,也可以使用控制器。在后一种情况下,只需发送一个命令,然后根据结果发送第二个命令。当第二个命令返回失败时,您可以补偿第一个命令

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

最后一点意见:通常情况下,这些情况取决于许多领域特定的细节。如果没有关于您构建它的领域或案例的任何信息,很难理智地回答这样的问题