我正在尝试在查询端进行更新
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()
函数。
可能的答案
- 简而言之,我认为您因此在该代码段中连接了错误的
Repository
实现来加载您的聚合。只需使用 Repository
i.o。 EventSourcingRepository
直接应该没问题。
- 您询问的
UnitOfWork
中的message
可以是Message
接口的任何实现。所以这可以是命令、事件或查询。
建议
1. 我经常建议不要直接使用 Repository
。 Axon Framework 可以通过让您在 CommandBus
/CommandGateway
上发布命令来完成繁重的工作。这与命令处理函数上的 @CommandHandler
注释一起,使框架能够自动从 Repository
加载正确的聚合并调用该注释函数。
我正在做的是尝试从存储库中获取聚合,然后处理该特定事件并将其标记为新事件...以便查询识别它是一个更新事件。 但问题是我无法获得该特定聚合。
我所做的在这里:
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()
函数。
可能的答案
- 简而言之,我认为您因此在该代码段中连接了错误的
Repository
实现来加载您的聚合。只需使用Repository
i.o。EventSourcingRepository
直接应该没问题。 - 您询问的
UnitOfWork
中的message
可以是Message
接口的任何实现。所以这可以是命令、事件或查询。
建议
1. 我经常建议不要直接使用 Repository
。 Axon Framework 可以通过让您在 CommandBus
/CommandGateway
上发布命令来完成繁重的工作。这与命令处理函数上的 @CommandHandler
注释一起,使框架能够自动从 Repository
加载正确的聚合并调用该注释函数。