我想在查询方面做更新

时间:2018-01-19 05:03:22

标签: cqrs axon

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

我所做的就是:

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 work = DefaultUnitOfWork.startAndGet(message ??);

提前致谢。

1 个答案:

答案 0 :(得分:2)

虽然我不完全确定你要做什么,听起来是你从EventStore检索事件并且你说你正在更新它们。我非常鼓励这样做。

EventStore只应附加。 存储在中的事件已经发生,因此历史记录。 在现实生活中,你无法调整历史记录,这就是你应该如何看待EventStore中的事件。

所以,这是一个警告。 您的代码段幸运地建议您只是尝试调用聚合上的函数来执行某个“操作”。 Action就是这里的关键字,因为它表示你正在做一个'命令'。因此,您可以通过聚合上的@CommandHandler注释字段轻松调用该函数来调整它。在这样做时,您不必手动加载聚合。

已添加,我无法确定您正在使用哪种Repository实施手动加载汇总(我猜是LockingRepository),但我建议您使用Repository接口而不是特定的实现。 该界面应该返回Aggregate<T>T是您示例中的CustomerAggregate。这应该可以让你根据需要调用updateAddresss()函数。

可能的答案

  1. 简而言之,我认为您因此在该代码段中连接了错误的Repository实现以加载您的聚合。只需使用Repository i.o. EventSourcingRepository直接做得很好。
  2. 您询问的message中的UnitOfWork可以是Message界面的任何实现。这可以是命令,事件或查询。
  3. <强>建议  我经常建议不要直接使用Repository。通过让您在CommandBus / CommandGateway上发布命令,Axon Framework可以在那里完成繁重的工作。这与命令处理函数的@CommandHandler注释一起使得框架将自动从Repository加载正确的聚合并调用该注释函数。