事件来源和标准存储库可以混合使用吗?

时间:2018-11-01 08:43:39

标签: axon

Axon中,可以为每种聚合类型配置不同的存储库吗?我的某些聚合可能是事件源的,而对于其他一些聚合则没有必要,如果不需要审核或恢复到较早的状态。

documentation about repositories and event stores中,它表示要实现接口Repository<T>,该接口绑定到特定类型的聚合。

/**
 * The repository provides an abstraction of the storage of aggregates.
 *
 * @param <T> The type of aggregate this repository stores.
 */
public interface Repository<T> extends ScopeAware

这使我相信我可以实现一个Repository<Car>Repository<Garage>等(可能会也可能不是事件源),并用Spring的@Repository进行注释,我很好去。是这样吗?

我知道一个similar question存在,但是答案只是指出:

  

您只能使用一个存储库来加载聚合。

这不能阐明单个存储库是绑定到所有聚合还是绑定到一个聚合类型。

设置验证

作为附带的问题,使用Standard Repository而不是Event Sourcing Repository可以缓解uniqueness constraint checking in CQRS的问题吗?当存储聚合的状态时(与只是事件相反),我可以在基础持久性存储中定义唯一性约束。提交后,该命令应该失败并且不应调度任何事件。我说得对吗?

1 个答案:

答案 0 :(得分:2)

您的应用程序内部可以很好地同时拥有GenericeJpaRepositoryEventSourcingRepository两者。但是,您不能做的是同时拥有两个用于单个Aggregate实现的存储库。

幸运的是,我发现这就是您要寻找的,存储不同聚合的不同方法。但是,如何配置这取决于一件事。如果您在Spring环境中,只需使用JPA注释对状态存储Aggregate进行注释就足够了。如果省略这些JPA批注,它将自动默认为事件源聚合。 但是,如果您不使用Spring,则可以使用AggregateConfigurer#jpaMappedConfiguration(用于状态存储的聚合)和AggregateConfigurer#defaultConfiguration(用于事件来源)进行配置。

简单地说,您很有可能不必实现自己的Repository。很抱歉听到文档使您相信情况确实如此,我将确保我们会对此进行调整。

关于您的设置验证问题,就将其移至数据库层而言,我不确定将其称为“解决问题”。正如您分享的文章所建议的那样,这是解决问题的一种方法,但这是有代价的。