Axon - 在查询时进行投影的最简单方法
Axon - Easiest way to make projection at query time
我通常每个聚合有 5-6 个事件,并且不希望将预测存储在数据库中。在查询时始终进行视图投影的最简单方法是什么?
对此的简短回答是,没有 easy/quick 方法可以做到这一点。
但是,实施 'replay given events at request time' 设置肯定是可行的。
我建议你做的事情分为几个步骤:
- 创建您想要return的查询模型,它可以处理事件(在模型上使用
@EventHandler
注释方法)
- 创建一个可以处理查询的组件,该查询将 return 第一步中的查询模型(为此使用
@QueryHandler
注释方法。
- Query-Handling-Component 应该能够从
EventStore
检索事件流。如果这是基于 aggregateIdentifier
,请使用 EventStore#readEvents(String)
方法。如果需要整个事件流,需要使用StreamableMessageSource#openStream(TrackingToken)
方法(注:EventStore
接口实现了StreamableMessageSource
)
- 在处理查询时,创建一个
AnnotationEventHandlerAdapter
,给它一个新的查询模型实例
- 对于您在第 3 点中创建的事件流中的每个事件,调用
AnnotationEventHandlerAdapter#handle(EventMessage)
方法。此方法将在您的查询模型对象 上调用 @EventHandler
注释方法
- 如果流耗尽,您可以确保您的查询模型的所有必要事件都已处理。因此,您现在可以 return 查询模型
因此,我再次认为这设置起来并不过分琐碎、简单或快速。
此外,第 3 步中有一个警告。基于聚合标识符检索给定聚合的流非常 fast/concise,因为聚合通常没有很多事件。
但是,如果您的查询模型跨越多个聚合,则需要根据 TrackingToken
检索事件流,可以确保您提取 整个 用于即时实例化模型的事件存储。当然,您可以在处理 TrackingToken
时微调您希望事件流到 return 事件的时间点,但是更改非常高,您将不完整且相对较慢。
但是,您声明要检索给定聚合标识符的事件。
因此,我认为这在您的场景中应该是一个可行的解决方案。
希望对您有所帮助!
我通常每个聚合有 5-6 个事件,并且不希望将预测存储在数据库中。在查询时始终进行视图投影的最简单方法是什么?
对此的简短回答是,没有 easy/quick 方法可以做到这一点。
但是,实施 'replay given events at request time' 设置肯定是可行的。
我建议你做的事情分为几个步骤:
- 创建您想要return的查询模型,它可以处理事件(在模型上使用
@EventHandler
注释方法) - 创建一个可以处理查询的组件,该查询将 return 第一步中的查询模型(为此使用
@QueryHandler
注释方法。 - Query-Handling-Component 应该能够从
EventStore
检索事件流。如果这是基于aggregateIdentifier
,请使用EventStore#readEvents(String)
方法。如果需要整个事件流,需要使用StreamableMessageSource#openStream(TrackingToken)
方法(注:EventStore
接口实现了StreamableMessageSource
) - 在处理查询时,创建一个
AnnotationEventHandlerAdapter
,给它一个新的查询模型实例 - 对于您在第 3 点中创建的事件流中的每个事件,调用
AnnotationEventHandlerAdapter#handle(EventMessage)
方法。此方法将在您的查询模型对象 上调用 - 如果流耗尽,您可以确保您的查询模型的所有必要事件都已处理。因此,您现在可以 return 查询模型
@EventHandler
注释方法
因此,我再次认为这设置起来并不过分琐碎、简单或快速。 此外,第 3 步中有一个警告。基于聚合标识符检索给定聚合的流非常 fast/concise,因为聚合通常没有很多事件。
但是,如果您的查询模型跨越多个聚合,则需要根据 TrackingToken
检索事件流,可以确保您提取 整个 用于即时实例化模型的事件存储。当然,您可以在处理 TrackingToken
时微调您希望事件流到 return 事件的时间点,但是更改非常高,您将不完整且相对较慢。
但是,您声明要检索给定聚合标识符的事件。 因此,我认为这在您的场景中应该是一个可行的解决方案。
希望对您有所帮助!