我刚刚了解了 CQRS,并一直在分析我现有的代码,寻找我违反或应用 CQRS 的地方。
到目前为止,我还没有发现任何查询正在改变状态的地方。然而,许多命令修改状态并返回表示更新状态的数据对象。
例如: Angular 客户端向/api/message.post. 用户的 ID 附加到 HTTP 服务器的请求(基于 HTTP 标头),并传递给处理message.post命令的微服务。命令处理程序的结果是{ok: false}or {ok: true, message: {_id: "xyz", text: "new" ...}},响应对象由 HTTP 服务器从微服务代理回 Angular。
从命令返回状态是否违反 CQRS?
我是否应该从命令中仅返回“ok:true/false”,然后发出第二个请求以获取新消息?如果是这样,为什么?
如果请求/响应是通过浏览器的 http 进行的,那么开销是否值得?
编辑我在命令末尾获得所需数据的原因是,我的读取和写入模型当前是相同的。我确实明白,将来我可以为命令应用写入模型,为查询应用读取模型,此时返回命令写入的数据不再有意义。
命令处理程序可以返回结果(好的,错误,一些数据),但是如果您使用服务总线,则处理程序可以在后台工作人员中执行,并且不会有人处理结果。
在您的情况下,我认为命令处理程序是由服务器端控制器直接执行的,因此您可以返回结果。但是,如果您期望的结果需要一个与命令无关的查询,那么最好使用不同的查询。
如果结果包含命令数据本身,则可以返回它。
顺便说一句,您要求的是 CQS,而不是 CQRS,在某种程度上它仍然是单一职责原则,但形式更专业。