1

我在高可扩展性网站上工作以用于学习目的。我决定使用 CQS 模式和 CQRS 的一些想法。我有单独的写入和读取层,供系统从消息总线(两个单独的消息总线)发送和接收的命令处理程序和事件处理程序使用。

我在处理命令时遇到了一些问题。我读到该命令不应该返回任何内容。现在的重点是:例如,我有一个表单,用户可以创建一个事件,或者例如更改他的个人资料(照片或姓名)中的某些内容。用户单击保存后,我想向他展示他的个人资料或将新事件添加到他的墙上。但是当命令只发送到总线时,我怎么知道他的个人资料已经更新了?我如何连接命令和 CRUD 操作的想法?或者可能是这个错误的想法?

4

2 回答 2

1

首先,分裂不应该在命令和事件之间,而是在域和读取模型之间。作为一般规则,您不能真正将 CQRS 命令映射到 CRUD 操作,尽管系统中的大多数命令都会更改存储库的状态。我将给你一个大致的概述它是如何工作的。假设您想添加一个用户,您创建一个命令 AddUserCommand 并为该消息分配一个 id。在后端,您有该命令的处理程序,您是对的,该命令不会返回任何内容。处理该命令后,您应该发布反映更改的事件:UserWasAddedEvent。此消息的 id 将是唯一的,但它可以并且应该具有与您在 UI 中创建的命令相关的 id。您的读取模型应该根据您发布的事件来处理事件并使用命令状态(等待、处理、completedOnError、completedSuccessfully)更新读取模型。在您提交命令后的 UI 上,您应该开始使用您创建的命令的 ID 查询读取的模型以获取状态,然后相应地更新您的 UI。

您认为 CQRS 处理程序返回 void 的权利,但您应该记住,通常在这样的架构中,后端应该返回提交命令的验证结果,而不是处理程序本身,而是您的 cqrs 处理程序周围的基础设施。

于 2014-03-18T09:36:14.757 回答
1

假设命令成功,只需更新 te UI - 大多数情况下它会成功。

如果需要对用户输入进行验证,您可以在用户键入或制表符时运行验证,以增加命令成功的可能性。

于 2014-03-17T09:48:24.423 回答