用于处理而非更新聚合的 CQRS 命令

CQRS command for processing and not for updating aggregate

我有一个使用领域驱动设计原则开发的项目。它是基于使用轴突框架的 CQRS。 我有一个场景,我需要在特定命令的位置使用聚合的状态在聚合中生成文档。我不需要将生成的文档的 ID 存储在聚合中。但是我需要使用生成的文档的 ID 从聚合中发布一个事件,因为另一个域需要该 ID。

触发命令不是为了更新聚合状态,而是为了执行一些处理和发布事件以更新其他聚合是否是一种好习惯?

此外,从聚合中发布事件而不是为了采购,而只是为了更新另一个域是否是一种好做法?

所以基本上你想使用一个 AR 作为另一个 AR 的工厂(Document 在这种情况下)?这实际上很常见,有助于忠实于无处不在的语言,而不是从无处产生 AR。

我不确定 AXON 命令处理程序如何工作以及之后状态如何保持,但我会这样做:

//Handler
Document doc = someAggregate.generateDocument(id, ...);
documentRepository.save(doc);

如果您真的不需要 Document AR,您可以直接创建事件:

DocumentGenerated event = someAggregate.generateDocument(id, ...);
eventStore.append(event); 

然后可以使用您现有的任何消息传递基础设施将 DocumentGenerated 事件分派到其他上下文。

我觉得生成文档的操作应该是域服务。域事件将由域服务生成,这不常见,但有可能。

当然,您可以发布不用于采购的领域事件。其实不用ES也可以做CQRS。事件是BC之间异步通信的一种方式。