我正在尝试在查询端进行更新

I am trying to do update on query side

我正在做的是尝试从存储库中获取聚合,然后处理该特定事件并将其标记为新事件...以便查询识别它是一个更新事件。 但问题是我无法获得该特定聚合。

我所做的在这里:

LockAwareAggregate<CustomerAggregate, EventSourcedAggregate<CustomerAggregate>> lockCustomerAggregate = 
    customerEventSourcingRepository.load(command.getId().toString());

EventSourcedAggregate<CustomerAggregate> eventSourcedCustomerAggregate = 
    lockCustomerAggregate.getWrappedAggregate();

CustomerAggregate customerAggregate = eventSourcedCustomerAggregate.getAggregateRoot();

customerAggregate.updateAddress(command.getAddress());

我在 2.4.3 中使用了这段代码,它返回了一个 CustomerAggregate,但现在它返回了一个 LockAwareAggregate。 能否请您指出我哪里出错了。

你能否也分享一下
中的消息 UnitOfWork 工作 = DefaultUnitOfWork.startAndGet(消息??);

提前致谢。

虽然我不完全确定您要做什么,但听起来您正在从 EventStore 中检索事件并且您说您正在更新它们。我强烈建议不要这样做。

EventStore 应该只追加。 其中存储的事件已经发生,所以这是历史。 在现实生活中你无法调整历史,这也是你应该如何看待你在EventStore中的事件。

所以,这是一个警告。 幸运的是,您的代码片段表明您只是试图在聚合上调用一个函数来执行某个 'action'。行动是这里的关键词,因为它表示您正在做 'command'。因此,您可以通过聚合上的 @CommandHandler 注释字段轻松调用该函数以对其进行调整。这样一来,您将不必手动加载聚合。

已添加,我真的看不出您正在使用哪个 Repository 实现来手动加载聚合(我猜是 LockingRepository),但我建议使用 Repository 接口而不是具体的实现。 该接口应该 return 你是 Aggregate<T>,而 T 是你示例中的 CustomerAggregate。这应该使您可以根据需要调用 updateAddresss() 函数。

可能的答案

  1. 简而言之,我认为您因此在该代码段中连接了错误的 Repository 实现来加载您的聚合。只需使用 Repository i.o。 EventSourcingRepository 直接应该没问题。
  2. 您询问的UnitOfWork中的message可以是Message接口的任何实现。所以这可以是命令、事件或查询。

建议 1. 我经常建议不要直接使用 Repository。 Axon Framework 可以通过让您在 CommandBus/CommandGateway 上发布命令来完成繁重的工作。这与命令处理函数上的 @CommandHandler 注释一起,使框架能够自动从 Repository 加载正确的聚合并调用该注释函数。