4

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

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

4

2 回答 2

6

你的理解是正确的。

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

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

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

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

于 2011-12-08T14:40:17.707 回答
4

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

命令告诉您的应用程序做某事。

事件向世界宣布你做了某事。

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

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

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

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

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

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

然后,这将重播与该用户打交道的所有事件并创建用户对象。

希望有帮助:)

于 2011-12-08T19:58:05.887 回答