我的问题与this one有关。虽然相关的问题和答案显示了我们为什么要将它们分开,但我想确保我对意图的理解是正确的。在我已经看到的所有示例中,似乎命令的意图是它可以被拒绝并且它更新内存中的对象,然后事件将更新数据库。现在我知道我在这里过度简化,但理解命令是为了更新内存和事件更新数据库是正确的吗?如果没有,有人可以为我澄清。
我试图学习这些模式,这就是我到目前为止所掌握的模式,我想确保它是正确的。提前谢谢。
答案 0 :(得分:7)
您的理解是正确的。
针对域模型发出命令并要求特定行为。域模型检查是否允许执行并相应地运行。 命令可以视为应该执行的特定用例。
另一方面,事件只是宣布事情已经发生(因为你无法改变过去,所以不能拒绝它们。)
根据这些事件,您的应用程序(以及集成方案中的其他应用程序)可以做出相应的反应 - 例如更新读取模型数据库。
特别是当应用事件采购模式时,事件是存储和重播的内容,以便在需要时为您的域模型重新水化。
答案 1 :(得分:4)
首先,我认为你并没有过度简化它。这是一个简单的概念。
命令告诉您的应用程序执行某些操作。
事件向全世界宣布你做了一些事情。
如果您的应用程序无法按照业务规则或其他原因执行操作,则不会执行此操作。而反过来也没有宣布任何事情。如果它确实做了某件事,那么它会通过一个事件宣布它。
如果有人订阅了这些事件,并在发生事件时小心,那么他们可以使用事件中的数据更新他们的应用程序。
在实践中,这通常意味着您的阅读模型会订阅事件并相应地更新自己。
创建用户。您发出User_CreateCommand,其中包含有关用户的信息。然后,命令处理程序将创建一个新对象,该对象是User,并将其保存到存储库。创建用户会触发一个User_CreatedEvent,它将由您的读取模型处理,并且将更新读取的模型。任何其他系统监听也可以自行更新。
需要进行一些研究的部分是,当您将用户保存到存储库时,实际上并没有像您想象的那样保存用户对象。您实际上正在保存User_CreatedEvent,其中包含有关该用户的所有数据。
稍后,当你需要你的用户对象时,你会调用类似_repo.GetById(1);
然后,这将重播处理该用户的所有事件并创建用户对象。
希望有所帮助:)