在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的问题吗?当存储聚合的状态时(与只是事件相反),我可以在基础持久性存储中定义唯一性约束。提交后,该命令应该失败并且不应调度任何事件。我说得对吗?
答案 0 :(得分:2)
您的应用程序内部可以很好地同时拥有GenericeJpaRepository
和EventSourcingRepository
两者。但是,您不能做的是同时拥有两个用于单个Aggregate实现的存储库。
幸运的是,我发现这就是您要寻找的,存储不同聚合的不同方法。但是,如何配置这取决于一件事。如果您在Spring环境中,只需使用JPA注释对状态存储Aggregate进行注释就足够了。如果省略这些JPA批注,它将自动默认为事件源聚合。
但是,如果您不使用Spring,则可以使用AggregateConfigurer#jpaMappedConfiguration
(用于状态存储的聚合)和AggregateConfigurer#defaultConfiguration
(用于事件来源)进行配置。
简单地说,您很有可能不必实现自己的Repository
。很抱歉听到文档使您相信情况确实如此,我将确保我们会对此进行调整。
关于您的设置验证问题,就将其移至数据库层而言,我不确定将其称为“解决问题”。正如您分享的文章所建议的那样,这是解决问题的一种方法,但这是有代价的。