【问题标题】:CQS and ASP.NET MVC ActionsCQS 和 ASP.NET MVC 操作
【发布时间】:2016-02-14 13:37:20
【问题描述】:

读过CQS原理的人都知道:

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

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

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

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

我想知道您对此的看法。

莫什

【问题讨论】:

标签: asp.net-mvc command-query-separation


【解决方案1】:

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 解决的问题并不真正相关,并且重定向可能很棘手。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这听起来是最好的答案,我同意你的看法。
    【解决方案3】:

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

    【讨论】:

    • 达林,我已经知道这个动作在做什么,这不是我问的! :) 我的问题是针对那些阅读过 CQS 及其对 ASP.NET MVC 操作的影响的人。
    • 很明显,如果您在应用程序的所有方法中都尊重 CQS,您将无法编写 ASP.NET MVC 应用程序。所以要么违反这个模式,要么找到另一个 Web 框架。我会去第一个:-)
    【解决方案4】:

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

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

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

    希望对你有帮助

    吉姆

    【讨论】:

    • 如果您稍微整理一下答案,它可能会对其他人有所帮助。它似乎没有清楚地回答这个问题。语法也可以稍微清理一下。
    • shanabus - 在需要的地方随时纠正。我已经 3 下来了:) 还有什么可能出错的!
    猜你喜欢
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多