在跟踪查询数量时维护CQS

时间:2015-11-02 20:13:52

标签: c# asp.net-mvc architecture command-query-separation

在我的网络应用中,我跟踪网页上的观看次数。

现在,控制器中的操作向数据层发出命令,以在返回查询结果之前增加模型上的视图计数。

此操作似乎违反了Command-Query-Separation的规则,因为在请求中,用户代理提交了一个查询,无意中发出了一个命令(以增加视图计数)

在此操作中需要采取哪些架构决策来维护Command-Query-Separation?

1 个答案:

答案 0 :(得分:1)

您应该考虑CQS相对于相关操作的概念级别。以下是一些似乎都违反CQS的示例,但只是在不同的概念级别上

  • 对文件系统对象进行ReadFile调用不会修改文件 - 但它可以更新文件上最后访问的时间戳。
  • 对存储库的FindById调用不应该更改数据库 - 但它可以很好地将查询的对象添加到缓存中。
  • REST API上的GET操作不应更改模型 - 但它可以更新统计数据。

这些示例有一个共同点:它们维护客户端工作的model的状态,但它们确实修改了该模型之外的数据。 这并不违反CQS。

另一种看法是principle of least surprise。上述REST API的客户端不希望模型随GET请求而改变,但他并不关心API是否更新了统计计数器。