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实现是否不符合命令/查询?
答案 0 :(得分:1)
与执行某些操作的命令相关并以严格的方式返回数据,这违反了CQS;因为命令通常不会返回任何内容,因此甚至可以异步执行。但是,我更喜欢更实用的方法:如果需要,命令可以返回ID。
然后,您可以将此ID返回给REST API的使用者;这基本上是消费者识别创建或修改的实体所需要的;以及specs说的是什么:
“如果在源服务器上创建了资源,则响应应该是201(已创建)并包含一个描述请求状态的实体,并引用新资源和Location头(请参阅第14.30节。“
此外,您可以使用投影:
...并使用您的REST服务公开这些,这样您就可以真正控制自己所暴露的内容。