1

读过CQS原理的人都知道:

CQS 声明每个方法都应该是执行操作的命令,或者是向调用者返回数据的查询,但不能同时是两者。

说到 ASP.NET MVC Actions,CQS 是否表明我们不应该有这样的 Action?

public PartialView InsertOrder(Order order)
{
       OrderService.InsertOrder(order);
       return PartialView("OrderDetails", order);
}

这个方法是改变系统的状态并返回当前状态。如果在这里应用 CQS,我们应该有 2 个单独的 Action:一个用于插入新订单,一个用于获取系统的系统(如果第一个 Action 成功完成,则应从客户端调用)。然而,这使编程变得复杂。

我想知道你对此的看法。

莫什

4

4 回答 4

7

网络上命令/查询分离的一个常见示例是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 解决的问题并不真正相关,并且重定向可能很棘手。

于 2010-08-02T09:25:34.090 回答
2

CQS 只关心对同一对象的命令和查询。由于 OrderView 的 Order 不是同一个对象(我从您的实现中猜想)该原则不适用,因此您的代码既不反对该原则也不赞成:)

于 2011-05-03T16:49:48.503 回答
1

我从未听说过 CQS,但如果您正在执行 ASP.NET MVC(MVC 模式),那么您编写的操作非常好(假设这OrderService是对真实服务的抽象)。控制器操作模型并决定渲染哪个视图并将此模型传递给视图。

于 2010-08-02T06:21:22.417 回答
-2

我对埃菲尔时代的这个术语有一个模糊的回忆(如果一直遵循,实际上比大多数当前的 oop 原则早了十年左右(我认为是 80 年代后期)。我建议这个术语和/或原则现在很可能已经过时并被 mvc 中的 actionresults 取代(是那个 asp 或 codeignitor 等)。我实际上认为就定义(我现在刚刚查找)而言,这种分离与执行的逻辑有关即OrderService.InsertOrder(order)在您的示例中的操作。因此,在某种程度上,在您的操作中执行的 mvc 实际上是遵循这种模式的(InsertOrder 不尝试呈现任何有状态信息,纯粹处理订单对象)。

我建议您查看 asp.net mvc 的最佳实践,它基本上基于返回 actionresult(或部分、contentresult 等)。这种模式旨在简化范式,以统一和普遍接受的方式促进生产力。

当然,您可以使用您的操作返回值来为插入/更新/删除方案生成成功或失败,然后根据这些返回值请求部分视图。但是,我个人认为我不会从该方法中获得太多价值,因为 MVC 中的控制器关心的是控制应该作为操作结果返回哪个视图的逻辑。

希望这可以帮助

吉姆

于 2010-08-02T08:49:10.623 回答