宁静的设计是否违反了命令查询原则?

时间:2016-10-06 02:15:33

标签: c# .net visual-studio http odata

RESTful设计是否违反了command and query segregation principle?

在我们的设计中,我们有控制器将请求路由到服务类。

服务类中的方法,无论是GET / POST / PUT,都将始终具有返回值:

public Dog PutDogToSleep(/*params*/)
{
   dogService.Sleep(..);
   return dog;
}

我现在找不到它,但我读到HTTP RESTful请求(get / post / put)应该返回运行请求的对象。例如,如果您正在执行PUT,那么您将执行该put,然后返回该对象的当前状态。

由于我们的方法正在做某事(.Sleep)和返回数据,它们是否违反了命令和查询段原则?

REST实现是否不符合命令/查询?

  

If您正在通过HTTP进行REST,然后RFC7231完全描述   GET,PUT,POST和DELETE的行为是什么。

1 个答案:

答案 0 :(得分:1)

与执行某些操作的命令相关并以严格的方式返回数据,这违反了CQS;因为命令通常不会返回任何内容,因此甚至可以异步执行。但是,我更喜欢更实用的方法:如果需要,命令可以返回ID。

然后,您可以将此ID返回给REST API的使用者;这基本上是消费者识别创建或修改的实体所需要的;以及specs说的是什么:

“如果在源服务器上创建了资源,则响应应该是201(已创建)并包含一个描述请求状态的实体,并引用新资源和Location头(请参阅第14.30节。“

此外,您可以使用投影

  • 根据查询方的数据实体构建仅供查看的DTO
  • 为命令端构建命令DTO

...并使用您的REST服务公开这些,这样您就可以真正控制自己所暴露的内容。