0

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

我所做的是在这里:

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 中使用了这段代码,它正在返回 aCustomerAggregate但现在它正在返回 a LockAwareAggregate。你能建议我哪里出错了。

您能否也分享
UnitOfWork work = DefaultUnitOfWork.startAndGet(message??);

提前致谢。

4

1 回答 1

2

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

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

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

补充说,我真的看不出Repository您使用哪个实现来手动加载聚合(我猜是LockingRepository),但我建议使用Repository接口而不是特定实现。该接口应该返回你一个Aggregate<T>TCustomerAggregate你的例子中的。这应该使您可以根据updateAddresss()需要调用该函数。

可能的答案

  1. 简而言之,我认为您因此Repository在该片段中连接了错误的实现来加载您的聚合。直接使用Repositoryio就可以了EventSourcingRepository
  2. 你问的可以是接口的任何message实现。所以它可以是命令、事件或查询。UnitOfWorkMessage

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

于 2018-01-19T09:25:42.947 回答