gpt4 book ai didi

java - 聚合中的实体可以移动到 Axon 中的另一个聚合(相同类型)吗

转载 作者:行者123 更新时间:2023-11-30 01:43:47 24 4
gpt4 key购买 nike

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

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

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

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

<小时/>

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

<小时/>

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

为此,我将使用传奇来确保:

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

对于应该发送到 aId1 并在 bId1 上执行操作的待处理命令会发生什么情况? (异常(exception),因为不再存在了?)

更改后,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 和事件溯源。您不想发出包含其中实体状态的事件。您唯一拥有的就是聚合中“发生了什么”的痕迹。您需要做的是找出“搬迁”在商业方面的真正含义。

就实现而言,您通常会将其视为添加和删除(无论顺序如何)。如果操作失败(也许添加无效),您将需要能够补偿失败。如果经常出现故障,那么是的,“保留并确认”方法会比“尝试和补偿”方法更好。

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

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

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

关于java - 聚合中的实体可以移动到 Axon 中的另一个聚合(相同类型)吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58956673/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com