事件源或 CQRS 应用程序的读取端是否也应该 return AggregateRoots?

Should the Read side of an event-sourced or CQRS application return AggregateRoots too?

在 event_sourced 环境中,例如 Ruby 工具包 event_sourcery the Aggregate Root has a clear function: to setup, compile data and emit events. As outlined in 'What's an Aggregate Root?'。

由该聚合根发出的事件,例如 Place,将发出 PlaceAdded 事件。

订阅的处理器然后确保将记录添加到投影中,即查询数据库中的 table。例如 table proposed_places.

在应用程序的另一端,CQRS的Q部分,有可以执行的查询;例如LatestProposedPlacesQuery 将 return 来自 proposed_places table 的建议地点列表。

到目前为止的设置(我也不相信这是完全正确的)。

现在,我想知道上面提到的聚合,即 Place 聚合,在查询时是否是 thing 到 return 的正确方法。换句话说,Proposed Places return 的查询是否应该是 Places 聚合根对象的列表?或者聚合只与应用程序的 command/write 部分有关?还是我完全误解了这一切?

In other words, should the query of Proposed Places return a list of Places aggregate root objects? Or is the Aggregate only concerned with the command/write part of the application? Or am I completely misunderstanding this alltogether?

TL;DR -- 您通常不会处理具有聚合根的查询消息。

2003年,引入聚合根模式时,就是这样做的;有一个数据结构,因此有一个对象知道该数据结构的细节,所以如果你想问一个关于数据结构的问题,你可以通过 "object".

转发它

所以您仍然会找到大量支持该方法的文献。

但在很多情况下,它并不能真正让你买账。特别是,将数据复制到对象中只是为了再次将其复制回来,这是一种浪费的仪式。分散在内存中的对象集合远不如精心调整的数据结构那么高效,而且在许多情况下,模型的陈旧表示提供了完整的商业价值,同时更容易交付和维护。

事件溯源进一步夸大了这一点,因为事件日志往往是回答问题的糟糕表现。

今天?聚合并没有为您的查询处理代码的可维护性增加太多 - 只需将数据转换为您需要的形状并继续使用它。

作为额外的好处,您可以在聚合中获得更好的凝聚力,因为该代码只需要担心为数据结构维护适当的域不变性,而不会被一堆与 改变.