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

Can event sourcing and standard repositories be mixed?

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 的 [= 注释它们14=] 我很高兴。是这样吗?

我知道 存在,但答案只是说明:

you can only use a single Repository to load an Aggregate.

这并没有说明单个存储库是绑定到所有聚合还是绑定到一种聚合类型。

设置验证

作为附带问题,是否会使用 Standard Repository as opposed to an Event Sourcing Repository alleviate the problem of uniqueness constraint checking in CQRS?当存储聚合状态时(与仅事件相反),我可以在底层持久性存储中定义唯一性约束。提交后,该命令应该失败并且不应分派任何事件。我说得对吗?

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

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

不过简单地说,您很可能不必实施自己的 Repository。很抱歉听到文档让您相信是这种情况,我保证我们会对此进行调整。

关于您的设置验证问题,我不确定将其称为 'solving the problem' 更多关于将其移动到数据库层的问题。正如您分享的文章所暗示的那样,这是解决问题的方法之一,但它是有代价的。