CQRS 读取模型和 REST API

CQRS Read Models & REST API

我们正在对我们的 CQRS 服务实施 REST API。我们当然不想向 REST APIs.

的用户公开我们的任何域

然而,CQRS 的一个关键租户是读取的模型通常对应于特定的视图或屏幕。

  1. 在这种情况下,我们的 REST API 中的资源将虚拟地映射 1:1 与我们查询中的读取/视图模型(其中查询 return 包含视图所有数据的 DTO)。从技术上讲,这暴露了我们领域的一部分(读取模型 - 尽管 returned 作为 DTO)。在这种情况下,这似乎就是我们想要的。如此紧密耦合有什么潜在的缺点吗?

  2. 在命令方面,我一直在考虑这样的方法: https://www.slideshare.net/fatmuemoo/cqrs-api-v2。有一张幻灯片表明命令不是第一个 class 公民。 (见幻灯片 26)。推而广之,我是否正确地假设从我的查询中 return 编辑的 DTO 将始终是第一个 class 公民,然后它将公开可以针对该屏幕执行的命令?

谢谢

Any potential downsides to being so closely coupled?

在理解依赖关系的方向方面,您需要多加小心。

具体来说,如果您尝试与 您无法控制 的客户端集成,那么您将需要就合同达成一致——消息语义和架构—— - 你不能单方面改变。

这意味着表示相对固定,但是对于如何实现该表示的生成,您有很大的自由度。您向客户承诺,他们可以获得报告 12345 的表示形式,并且其中会有一些方便的信息布局。但是,该表示是您按需生成的东西,还是缓存的东西,以及如何构建它完全取决于您。

在这个级别,您并没有真正将您的客户耦合到您的领域模型;您正在将它们耦合到您的 views/reports,也就是说耦合到您的 data 模型。而且,在 CQRS 世界中,这种耦合是针对读取模型,而不是写入模型。

In terms of commands, I have been considering an approach like...

我要温和地建议作者,在 2015 年,按照今天的标准,对 REST 的理解不是特别好。

这里的基本问题是作者没有认识到 cachingREST constraint; and the design of our HTTP protocols needs to consider how general purpose components understand cache invalidation.

通常,对于命令(这里指的是“旨在更改资源表示的消息”),您通常希望 HTTP 请求的目标 uri 与发生更改的主要资源的标识符相匹配。

POST /foo/123/command

如果没有人发送 GET /foo/123/command 请求,从缓存失效的角度来看并不是特别有用。