我是Axon框架新手。我在我正在处理的资产管理模块中有一个需求。在此模块中,将构建不同类型资产,这些资产需要以与SQL中的一对一关系类似的方式进行配对。我发现很难为这种格式设计一个聚合。
业务逻辑验证如下:两个assetId为输入。这些标识符类似于聚合标识符。然后,加载绑定到这些assetId的资产实例,并检查状态是未配对还是配对。如果两个资产都是未配对的,则将它们配对(将状态更新为已配对并将UUID添加到associatedAssets)。否则将引发异常。
我想出了以下聚合类:
@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;
}发布于 2020-05-07 19:03:22
在您给出的示例中,PairAssetsCommand不能由单个AssetAggregate处理,因为它跨越了两个不同聚合实例的一致性边界。也就是说,两个不同的AssetAggregate。
请注意,聚合定义了命令模型中的一致性边界。因此,它接收的任何命令及其产生的所有事件(以及随后的状态更改)都将被视为原子操作。通过这种方式在多个实体之间建立关联可能意味着两件事:
创建一个更大的集合类,这个集合类跨越所有AssetAggregates.
PairAssetsCommand.
的(即,聚合外的@CommandHandler ) External Command Handler
我建议不要选择第一个选项,因为它会扩大系统中整个资产集的一致性边界。这最终将成为维护聚合“保持一致性边界”的主要瓶颈。
因此,剩下的选择2。让我们重新表述您已经定义的业务逻辑:
如果两个资产都未配对,则将其配对(将状态更新为
并将UUID添加到associatedAssets),否则将引发异常
AssociateWithAssetCommand分派给两个AssetAggregate,如果其中一个AssetAggregate已经是处理set based validation的外部命令处理程序中的PairAssetsCommand,则分派补偿命令,以验证您的业务逻辑。解决方案二要求您有一个包含一组资产及其关联状态的小型查询模型。添加后,此查询模型需要在发生关联命令时的同一事务中进行更新。因此,稍微复杂一些。
https://stackoverflow.com/questions/61349489
复制相似问题