CQRS中的命令和事件的意图w / ES

时间:2011-12-07 16:36:28

标签: cqrs event-sourcing

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

我试图学习这些模式,这就是我到目前为止所掌握的模式,我想确保它是正确的。提前谢谢。

2 个答案:

答案 0 :(得分:7)

您的理解是正确的。

针对域模型发出

命令并要求特定行为。域模型检查是否允许执行并相应地运行。 命令可以视为应该执行的特定用例。

另一方面,

事件只是宣布事情已经发生(因为你无法改变过去,所以不能拒绝它们。)

根据这些事件,您的应用程序(以及集成方案中的其他应用程序)可以做出相应的反应 - 例如更新读取模型数据库。

特别是当应用事件采购模式时,事件是存储和重播的内容,以便在需要时为您的域模型重新水化。

答案 1 :(得分:4)

首先,我认为你并没有过度简化它。这是一个简单的概念。

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

事件向全世界宣布你做了一些事情。

如果您的应用程序无法按照业务规则或其他原因执行操作,则不会执行此操作。而反过来也没有宣布任何事情。如果它确实做了某件事,那么它会通过一个事件宣布它。

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

在实践中,这通常意味着您的阅读模型会订阅事件并相应地更新自己。

创建用户。您发出User_CreateCommand,其中包含有关用户的信息。然后,命令处理程序将创建一个新对象,该对象是User,并将其保存到存储库。创建用户会触发一个User_CreatedEvent,它将由您的读取模型处理,并且将更新读取的模型。任何其他系统监听也可以自行更新。

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

稍后,当你需要你的用户对象时,你会调用类似_repo.GetById(1);

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

希望有所帮助:)