1

Axon中,我可以为每种聚合类型配置不同的存储库吗?我的一些聚合可能是事件源的,而如果不需要审计或恢复到较早的状态,则对其他人来说毫无意义。

有关存储库和事件存储的文档中,它说要实现接口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我很高兴。是这样吗?

我知道存在类似的问题,但答案只是说明:

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

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

设置验证

作为一个附带问题,使用标准存储库而不是事件源存储库会缓解CQRS 中唯一性约束检查的问题吗?在存储聚合的状态时(与仅事件相反),我可以在底层持久性存储中定义唯一性约束。提交后,命令应该失败并且不应该分派任何事件。我对么?

4

1 回答 1

3

您的应用程序可以很好地同时拥有内部调用的内容,GenericeJpaRepository以及EventSourcingRepository彼此相邻的内容。但是,您不能做的是为单个 Aggregate 实现同时拥有两个存储库。

幸运的是,我看到这就是您正在寻找的,存储不同聚合的不同方式。但是,如何配置它取决于一件事。如果您在 Spring 环境中,只需使用 JPA 注释来注释您的状态存储聚合就足够了。如果省略这些 JPA 注释,它将自动默认为事件源聚合。但是,如果您不使用 Spring,则可以使用AggregateConfigurer#jpaMappedConfigurationfor state-stored Aggregates 和AggregateConfigurer#defaultConfigurationfor the Event Sourcing 方法进行配置。

简而言之,您很可能不必实现自己的Repository. 很遗憾听到文档让您相信是这种情况,我会确保我们会调整它。

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

于 2018-11-01T09:56:44.277 回答