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

时间:2018-12-18 18:04:42

标签: domain-driven-design cqrs axon

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

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

从汇总发布事件而不是仅用于更新另一个域的活动还是一种好习惯吗?

2 个答案:

答案 0 :(得分:1)

因此,基本上,您想将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事件可以使用已有的消息传递基础结构分派到其他上下文。

答案 1 :(得分:1)

我认为也许生成文档的操作应该是域服务。而且,域事件将由域服务生成,这不是很常见,但这是可能的。

当然,您可以发布不用于采购的域事件。实际上,您可以在不使用ES的情况下执行CQRS。事件是BC之间异步通信的一种方式。