1

CQS の原則について読んだことがある人は、次のことを知っています。

CQS では、すべてのメソッドは、アクションを実行するコマンド、または呼び出し元にデータを返すクエリのいずれかである必要がありますが、両方である必要はありません。

ASP.NET MVC アクションについて言えば、CQS は、このようなアクションを持つべきではないことを示していますか?

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

このメソッドは、システムの状態を変更し、現在の状態を返します。ここで CQS が適用される場合、2 つの別個のアクションが必要です。1 つは新しい注文を挿入するためのもので、もう 1 つはシステムのシステムを取得するためのものです (最初のアクションが正常に完了した場合、クライアントから呼び出される必要があります)。ただし、これはプログラミングを複雑にします。

これについてあなたの意見を知りたいです。

モッシュ

4

4 に答える 4

7

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が解決する問題は実際には関連性がなく、リダイレクトが難しい場合があるため、これは最善の戦略ではない可能性があります。

于 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 原則よりも 10 年ほど前 (80 年代後半だと思います)。この用語および/または原則は現在時代遅れであり、mvc の actionresults に取って代わられている可能性があります (その asp や codeignitor など)。したがって、ある意味では、アクションOrderService.InsertOrder(order)で実行される mvc は実際にはこのパターンに従ってルーズリーです (InsertOrder はステートフルな情報を提示しようとせず、純粋に注文オブジェクトを処理します)。

actionresult (または部分、contentresult など) を返すことに基本的に基づいている asp.net mvc のベスト プラクティスを確認することをお勧めします。このパターンは、パラダイムを単純化して、均一で普遍的に受け入れられている方法で生産性を高めるように設計されています。

もちろん、アクションの戻り値を使用して、挿入/更新/削除シナリオの成功または失敗を生成し、それらの戻り値に基づいて部分ビューを要求することもできます。ただし、個人的には、MVC のコントローラーがアクションの結果として返されるビューのロジックを制御することに関係しているという事実を念頭に置いて、そのアプローチからあまり多くの価値を活用するとは思いません。

お役に立てれば

ジム

于 2010-08-02T08:49:10.623 に答える