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

Can I depend on aggregate while preparing read-model

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

  1. 在命令处理程序中,我可以在处理生成任何 events/validating 请求的命令时加载已处理 entity/model 的 CRUD 吗?
  2. 这里的 EventStore 意味着它可以在内存中 event-queue/any 数据库之类的,对吧?
  3. 我可以 post 来自命令处理程序的相关聚合的事件吗?
  4. 在生成读取模型时,我可以从过去的事件和当前事件中重新生成聚合吗?

一句话回答标题问题:没有

您的读取模型应该只依赖于聚合生成的事件。您可能有多个读取模型:一个用于 ui,另一个用于报告,然后一个用于日志记录,还有一个用于统计,仅举几例。

您不希望任何读取模型在您更改写入模型时中断。您也不希望您的写入模型受到任何读取模型的约束。

将事件作为唯一的依赖项可以很好地分离。

所以,对于其他问题:

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