我正在做的是我尝试从存储库中获取聚合,然后处理该特定事件并将其标记为新事件...以便查询识别出它是更新事件。 但问题是我无法得到那个特定的聚合。
我所做的就是:
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 ??);
提前致谢。
答案 0 :(得分:2)
虽然我不完全确定你要做什么,听起来是你从EventStore
检索事件并且你说你正在更新它们。我非常鼓励不这样做。
你EventStore
只应附加。
存储在中的事件已经发生,因此历史记录。
在现实生活中,你无法调整历史记录,这就是你应该如何看待EventStore
中的事件。
所以,这是一个警告。
您的代码段幸运地建议您只是尝试调用聚合上的函数来执行某个“操作”。 Action就是这里的关键字,因为它表示你正在做一个'命令'。因此,您可以通过聚合上的@CommandHandler
注释字段轻松调用该函数来调整它。在这样做时,您不必手动加载聚合。
已添加,我无法确定您正在使用哪种Repository
实施手动加载汇总(我猜是LockingRepository
),但我建议您使用Repository
接口而不是特定的实现。
该界面应该返回Aggregate<T>
,T
是您示例中的CustomerAggregate
。这应该可以让你根据需要调用updateAddresss()
函数。
可能的答案
Repository
实现以加载您的聚合。只需使用Repository
i.o. EventSourcingRepository
直接做得很好。message
中的UnitOfWork
可以是Message
界面的任何实现。这可以是命令,事件或查询。 <强>建议强>
我经常建议不要直接使用Repository
。通过让您在CommandBus
/ CommandGateway
上发布命令,Axon Framework可以在那里完成繁重的工作。这与命令处理函数的@CommandHandler
注释一起使得框架将自动从Repository
加载正确的聚合并调用该注释函数。