在准备读模型时我可以依赖聚合吗?

时间:2015-09-05 12:00:41

标签: design-patterns crud cqrs event-sourcing

我正在尝试在我的应用程序的某些部分实现CQRS模型,其余部分以CRUD风格处理。在写入方面,当我在命令处理程序中发布命令时,我将加载聚合并生成必要的事件并将它们存储在EventStore中,并将发布这些事件以创建/更新读取模型。我的问题是

  1. 在命令处理程序中,我可以在处理生成任何事件/验证请求的命令时加载CRUD处理的实体/模型吗?
  2. 这里EventStore意味着它可以在内存事件队列/任何类型的DB中,对吧?
  3. 我可以从命令处理程序的相关聚合中发布事件吗?
  4. 生成读取模型时,我可以从过去的事件中重新生成聚合以及当前事件吗?

1 个答案:

答案 0 :(得分:2)

用一个单词回答标题问题:否。

您的阅读模型应仅取决于您的聚合生成的事件。您可能有多个读取模型:一个用于ui,另一个用于报告,一个用于记录,另一个用于统计,仅举几例。

每当更改写入模型时,您都不希望任何读取模型中断。您也不希望您的写入模型受任何读取模型的约束。

将事件作为唯一的依赖关系进行了很好的分离。

所以,对于其他问题:

  • 命令处理程序将从存储库加载一个聚合,进行更新 它,然后将其保存到存储库。
  • 命令处理程序不会生成事件,聚合会生成事件。
  • 请求验证通常在将命令发送到处理程序之前完成,但如果处理程序是您的第一步,则必须在那里进行验证。
  • 事件存储只是存储事件,以便您稍后可以检索一个聚合并按正确顺序检索它们。您存储活动的方式和位置取决于您。
  • 相关聚合通常在传单/流程管理器中处理。其中一个原因是一次更新多个聚合会很快就会变得混乱。
  • 通过监听事件流,在事后生成读取模型。你如何以及何时进行聆听取决于你。您可以通过监听事件调度程序来进行进程,也可以通过从持久数据存储中读取某个检查点之后的所有事件来进行进程。
  • 每次从存储库中检索聚合时,都会重新生成聚合。存储库的工作是读取聚合的所有事件并应用它们。