CQS和ASP.NET MVC操作

阅读有关CQS原理的人知道:   CQS声明每种方法都应该   要么是执行一个的命令   操作或返回数据的查询   给来电者,但不是两者。 说到ASP.NET MVC动作,CQS是否表明我们不应该有这样的动作?
public PartialView InsertOrder(Order order)
{
       OrderService.InsertOrder(order);
       return PartialView("OrderDetails", order);
}
此方法正在更改系统的状态并返回当前状态。如果在这里应用CQS,我们应该有两个单独的操作:一个用于插入新订单,一个用于获取系统系统(如果第一个Action成功完成,应该从客户端调用)。但是,这使编程变得复杂。 我想知道你对此的看法。 MOSH     
已邀请:
我对埃菲尔时代的这个术语有一个模糊的回忆(如果一直追随,实际上早于大多数现有的oop原则大约十年左右(我认为是80年代后期)。我建议这个术语和/或原则现在可能已经过时了,并且被mvc中的行为结果所取代(如asp或codeignitor等等)。我实际上认为就定义而言(我现在只是查看),这种分离与执行的逻辑有关。你的例子中的动作即
OrderService.InsertOrder(order)
。所以,在某种程度上,在你的动作中执行的mvc实际上是遵循这种模式的loosley(InsertOrder不会尝试呈现任何有状态信息,纯粹处理订单对象)。 我建议你看一下asp.net mvc的最佳实践,这是基于返回一个actionresult(或部分,contentresult等等)的fundementally。这种模式旨在简化范式,以统一和普遍接受的方式促进生产力。 当然,您可以使用操作返回值为插入/更新/删除方案生成成功或失败,然后根据这些返回值请求部分视图。但是,我个人并不认为我会从这种方法中获得太多的价值,因为MVC中的控制器关注的是通过操作结果应该返回哪个视图的逻辑。 希望这可以帮助 吉姆     
Web上的命令/查询分离的常见示例是Post / Redirect / Get。 在ASP.NET MVC中,这通常以最简单的方式实现
[HttpPost]
public ActionResult UpdateOrder(Order order){
  UpdateOrder(order);
  return RedirectToAction("ViewOrder", new { order.OrderId });
}

[HttpGet]
public ActionResult ViewOrder(int orderId){
  return View(GetOrder(orderId));
}
对于AJAX和部分视图,这可能不是最佳策略,因为Post / Redirect / Get解决的问题并不真正相关,并且重定向可能很棘手。     
CQS仅关注对同一对象的命令和查询。由于OrderView订单不是同一个对象(我猜你的实现)原则不适用,所以你的代码不反对原则也不赞成:)     
我从来没有听说过CQS,但是如果你正在做ASP.NET MVC(MVC模式),你写的动作就完全没问题了(假设这个
OrderService
对真实服务有一个抽象)。控制器操纵模型并决定渲染哪个视图并将此模型传递给视图。     

要回复问题请先登录注册