我是Axon框架的新手。在这个模块中,不同类型的资产被建立起来,需要以类似于SQL中一对一关系的方式进行配对,我发现很难为这种格式设计一个Aggregate。我发现很难为这种格式设计一个Aggregate。
业务逻辑的验证如下:两个 assetId
s为输入。这些标识符类似于集合标识符.然后,加载与这些标识符绑定的资产实例 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;
}
在你给出的示例中, PairAssetsCommand
不能由一个人处理 AssetAggregate
因为它跨越了两个不同聚合实例的一致性边界。也就是说,两个不同的 AssetAggregate
s.
请注意,Aggregate定义了命令模型内的一致性边界。因此,由它接收的任何命令和它所产生的所有事件(以及随后的状态变化)将被视为一个原子操作。通过这种方式在几个实体之间建立关联可能意味着两件事。
AssetAggregate
s.@CommandHandler
外的),它处理的对象是 PairAssetsCommand
.我建议不要选择方案一,因为它将扩大你系统中整个资产集的一致性边界。这最终会成为维持Aggregate "保持一致性边界 "要求的主要瓶颈。
这样就剩下方案2了。让我们重新表述一下你所定义的业务逻辑。
如果两个资产都没有配对,那么就把它们配对(更新状态为配对,并将UUID添加到associatedAssets),否则就引发异常。
这意味着你不能在单个实例上进行验证,而是需要在多个实例上进行验证。同样,你可以采取两种途径来解决这个问题。
AssociateWithAssetCommand
对两个 AssetAggregate
的情况下,发出补偿命令。AssetAggregate
s已经关联。PairAssetsCommand
来验证你的业务逻辑。我想说,这两种方法哪种最好是留给你的喜好的。解决方案二需要你有一个小的查询模型,包含一组资产和它们的关联状态'。补充一下,这个查询模型需要更新在 同业 作为关联命令发生时。因此,有些复杂。
因此,在你的方案中,解决方案一将是最简单的方式。