与轴突框架的一对一关系

问题描述 投票:0回答:1

我是Axon框架的新手。在这个模块中,不同类型的资产被建立起来,需要以类似于SQL中一对一关系的方式进行配对,我发现很难为这种格式设计一个Aggregate。我发现很难为这种格式设计一个Aggregate。

业务逻辑的验证如下:两个 assetIds为输入。这些标识符类似于集合标识符.然后,加载与这些标识符绑定的资产实例 assetId的状态,并检查其是未配对还是已配对。如果两个资产都未配对,则将它们配对(将状态更新为配对,并将UUID添加到associatedAssets)。否则就引发一个异常。

我想出了下面的Aggregate类。

@Aggregate
@Data
public class AssetAggregate {
    @AggregateIdentifier
    private UUID assetId;
    private String assetType;
    private HashMap<String,String> attributes;
    private String status;
    private String modifier;
    private UUID associatedAsset;
}

我的配对命令信息是这样的:

@Data
public class PairAssetCommand {
    private UUID assetAId;
    private UUID assetBId;
}
spring-boot cqrs axon
1个回答
0
投票

在你给出的示例中, PairAssetsCommand 不能由一个人处理 AssetAggregate 因为它跨越了两个不同聚合实例的一致性边界。也就是说,两个不同的 AssetAggregates.

请注意,Aggregate定义了命令模型内的一致性边界。因此,由它接收的任何命令和它所产生的所有事件(以及随后的状态变化)将被视为一个原子操作。通过这种方式在几个实体之间建立关联可能意味着两件事。

  1. 你创建了一个更大的Aggregate类,它跨越了... AssetAggregates.
  2. 你有一个 外部命令处理程序 (即在Aggregate的 @CommandHandler 外的),它处理的对象是 PairAssetsCommand.

我建议不要选择方案一,因为它将扩大你系统中整个资产集的一致性边界。这最终会成为维持Aggregate "保持一致性边界 "要求的主要瓶颈。

这样就剩下方案2了。让我们重新表述一下你所定义的业务逻辑。

如果两个资产都没有配对,那么就把它们配对(更新状态为配对,并将UUID添加到associatedAssets),否则就引发异常。

这意味着你不能在单个实例上进行验证,而是需要在多个实例上进行验证。同样,你可以采取两种途径来解决这个问题。

  1. 派遣一个 AssociateWithAssetCommand 对两个 AssetAggregate的情况下,发出补偿命令。AssetAggregates已经关联。
  2. 使用 集合式验证 的外部命令处理程序中,处理 PairAssetsCommand 来验证你的业务逻辑。

我想说,这两种方法哪种最好是留给你的喜好的。解决方案二需要你有一个小的查询模型,包含一组资产和它们的关联状态'。补充一下,这个查询模型需要更新在 同业 作为关联命令发生时。因此,有些复杂。

因此,在你的方案中,解决方案一将是最简单的方式。

© www.soinside.com 2019 - 2024. All rights reserved.