2015-09-05 50 views
1

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

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

http://williamverdolini.github.io/images/cqrses/CQRS-ES-architecture.png应该回答一些问题 –

+0

@SirRufo太棒了!这真的有帮助。你有同样的好分辨率吗? – Pokuri

+0

不,我不是(我不是创造者),但是你可能会发现这也有助于阅读http://williamverdolini.github.io/Cqrs-es-todos.html –

回答

2

回答标题中的问题,一个字:不。

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

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

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

那么,对于其他问题:

  • 命令处理程序将加载一个聚合的存储库,更新 它,然后将其保存到存储库。
  • 命令处理程序不会生成事件,聚合会。
  • 请求验证通常在将命令发送到处理程序之前完成,但如果处理程序是您的第一步,那么您必须在那里进行验证。
  • 事件存储只是存储事件,以便以后可以检索它们,并按正确的顺序存储一个聚合。您如何以及在哪里存储事件取决于您。
  • 相关集合通常在传奇/流程管理器中处理。其中一个原因是,立即更新多个聚合会变得非常快速。
  • 通过监听事件流,可以在事件之后生成读取模型。如何以及何时进行倾听取决于您。您可以通过侦听事件分派器来进行进程内处理,也可以通过从持久数据存储中读取特定检查点之后的所有事件来进行进程外处理。
  • 每当您从存储库检索到聚合时,都会重新生成一个聚合。存储库的工作是读取聚合的所有事件并应用它们。
+0

很好的解释。谢谢你的时间。 – Pokuri