在跟踪查询数量时维护 CQS
Maintaining CQS When Tracking Number Of Queries
在我的网络应用程序中,我正在跟踪页面上的查看次数。
现在,控制器中的操作向数据层发出命令以在返回查询结果之前增加模型上的视图计数。
此操作似乎违反了命令-查询-分离的规则,因为用户代理在提交请求时提交了一个查询并且无意中发出了一个命令(以增加视图数)
需要采取哪些架构决策来维持此操作中的命令-查询-分离?
您应该相对于相关操作的概念级别来考虑 CQS。这里有一些例子似乎都违反了 CQS,但只是在不同的概念层面:
- 对文件系统对象的
ReadFile
调用不会修改文件 - 但它可以更新文件上最后访问的时间戳。
- 对存储库的
FindById
调用不应更改数据库 - 但它可以很好地将查询的对象添加到缓存中。
- REST 上的 GET 操作 API 不应更改模型 - 但它可以更新统计数据。
这些示例有一个共同点:它们维护 model
客户端工作的状态,但它们会修改该模型之外的数据。 这并不违反 CQS。
另一种查看方式是通过 principle of least surprise。上述 REST API 的客户端不会期望模型随 GET 请求而改变,但他不关心 API 是否更新统计计数器。
在我的网络应用程序中,我正在跟踪页面上的查看次数。
现在,控制器中的操作向数据层发出命令以在返回查询结果之前增加模型上的视图计数。
此操作似乎违反了命令-查询-分离的规则,因为用户代理在提交请求时提交了一个查询并且无意中发出了一个命令(以增加视图数)
需要采取哪些架构决策来维持此操作中的命令-查询-分离?
您应该相对于相关操作的概念级别来考虑 CQS。这里有一些例子似乎都违反了 CQS,但只是在不同的概念层面:
- 对文件系统对象的
ReadFile
调用不会修改文件 - 但它可以更新文件上最后访问的时间戳。 - 对存储库的
FindById
调用不应更改数据库 - 但它可以很好地将查询的对象添加到缓存中。 - REST 上的 GET 操作 API 不应更改模型 - 但它可以更新统计数据。
这些示例有一个共同点:它们维护 model
客户端工作的状态,但它们会修改该模型之外的数据。 这并不违反 CQS。
另一种查看方式是通过 principle of least surprise。上述 REST API 的客户端不会期望模型随 GET 请求而改变,但他不关心 API 是否更新统计计数器。