CQRS中命令和事件的意图

CQRS中命令和事件的意图,cqrs,event-sourcing,Cqrs,Event Sourcing,我的问题是关于。虽然相关的问题和答案说明了我们为什么要将它们分开,但我想确保我对意图的理解是正确的。在我看到的所有示例中,命令的意图似乎是可以拒绝它,并更新内存中的对象,然后事件将更新数据库。现在我知道我在这里过于简化了,但是理解命令是用来更新内存和事件更新数据库的,对吗?如果没有,请有人给我澄清一下 我正在努力学习这些模式,这就是我目前掌握的方式,我想确保它是正确的。提前感谢。您的理解是正确的 针对域模型发出命令并请求特定行为。域模型检查是否允许执行,并相应地执行。可以将命令视为应该执行的特定

我的问题是关于。虽然相关的问题和答案说明了我们为什么要将它们分开,但我想确保我对意图的理解是正确的。在我看到的所有示例中,命令的意图似乎是可以拒绝它,并更新内存中的对象,然后事件将更新数据库。现在我知道我在这里过于简化了,但是理解命令是用来更新内存和事件更新数据库的,对吗?如果没有,请有人给我澄清一下


我正在努力学习这些模式,这就是我目前掌握的方式,我想确保它是正确的。提前感谢。

您的理解是正确的

针对域模型发出命令并请求特定行为。域模型检查是否允许执行,并相应地执行。可以将命令视为应该执行的特定用例

另一方面,事件只是宣布某些事情已经发生(它们不能被拒绝,因为你无法改变过去。)

基于这些事件,您的应用程序(以及集成场景中的其他应用程序)可以做出相应的反应——例如更新读取模型数据库


特别是当应用事件源模式时,事件就是存储和回放的内容,以便在需要时重新水化您的域模型。

首先,我不认为您过于简化了它。这是一个简单的概念

命令告诉应用程序执行某些操作

事件向全世界宣布你做了什么

如果您的应用程序不能执行它被告知要执行的操作(因为业务规则或其他原因),那么它不会执行。反过来也不会宣布任何事情。如果它确实做了什么,那么它会通过一个事件来宣布

如果有人订阅了这些事件,并且关心它们何时发生,那么他们可以使用事件中的数据更新其应用程序

实际上,这通常意味着您的读取模型订阅事件并相应地更新自身

以创建用户为例。您发出一个User_CreateCommand,其中包含有关用户的信息。然后,命令处理程序将创建一个新对象,该对象是一个用户,并将其保存到存储库中。创建用户将触发一个用户\u CreatedEvent,该用户将由您的读取模型处理,并且读取模型将被更新。任何其他正在侦听的系统也可以进行自我更新

需要进行一点研究的部分是,当您将用户保存到存储库时,实际上并没有像您所想的那样保存用户对象。实际上,您正在保存用户_CreatedEvent,其中包含有关该用户的所有数据

稍后,当您需要您的用户对象时,您将调用类似于_repo.GetById(1)的东西

然后,这将重播处理该用户的所有事件,并创建用户对象

希望有帮助:)