web-dev-qa-db-ja.com

ASP.NET MVC-コントローラーにビジネスロジックが存在する必要がありますか?

Derik Whitakerが article を数日前に投稿しましたが、それは私がしばらく気になっていた点にぶつかりました:コントローラーにビジネスロジックが存在すべきか?

これまで、私が見たすべてのASP.NET MVCデモでは、コントローラーにリポジトリアクセスとビジネスロジックを配置しました。そこに検証を投げる人もいます。これにより、かなり大きく肥大化したコントローラーが作成されます。これは本当にMVCフレームワークを使用する方法ですか?これは、多くの複製されたコードとロジックが異なるコントローラーに広がってしまうだけのようです。

96
Kevin Pang

ビジネスロジックは実際にモデルに含まれている必要があります。脂肪モデル、スキニーコントローラーを目指してください。

たとえば、次の代わりに:

public interface IOrderService{
    int CalculateTotal(Order order);
}

私はむしろしたい:

public class Order{
    int CalculateTotal(ITaxService service){...}        
}

これは、税金が外部サービスによって計算されることを想定しており、モデルが外部サービスへのインターフェースについて知る必要があります。

これにより、コントローラーは次のようになります。

public class OrdersController{
    public OrdersController(ITaxService taxService, IOrdersRepository ordersRepository){...}

    public void Show(int id){
        ViewData["OrderTotal"] = ordersRepository.LoadOrder(id).CalculateTotal(taxService);
    }
}

またはそのようなもの。

75
jonnii

Microsoft Patterns&Practices で表示される図が気に入っています。そして、「絵は千の言葉に値する」という格言を信じています。

Diagram shows architecture of MVC and business sevices layers

63
AlejandroR

サービス層による検証 を示すStephen Waltherによるこの素晴らしいチュートリアルを確認できます。

検証ロジックをコントローラーアクションから別のサービスレイヤーに移動する方法を学びます。このチュートリアルでは、Stephen Waltherが、サービスレイヤーをコントローラーレイヤーから分離することで、懸念事項を明確に分離する方法を説明します。

14

これは興味深い質問です。

興味深いのは、多数のサンプルMVCアプリケーションが、実際にモデルに完全に「ビジネスロジック」を配置するという意味で、MVCパラダイムに従わないことです。 Martin Fowlerは、MVCはGang Of Fourの意味でのパターンではないことを指摘しています。むしろ、プログラマーがパターンを追加する必要があるのがパラダイムですtoおもちゃのアプリを超えて何かを作成している場合。

したがって、簡単な答えは、「ビジネスロジック」は実際にはコントローラー内に存在するべきではないということです。コントローラーにはビューとユーザーインタラクションを処理する追加機能があり、1つの目的のみでオブジェクトを作成するためです。

より長い答えは、ロジックをコントローラーからモデルに移動する前に、モデルレイヤーの設計にいくつかの考えを入れる必要があるということです。おそらく、RESTを使用してすべてのアプリロジックを処理できます。その場合、モデルの設計はかなり明確でなければなりません。そうでない場合は、モデルが肥大化しないようにするためにどのアプローチを使用するかを知っておく必要があります。

14

ビジネスロジックをコントローラーに含めることはできません。コントローラーはできるだけ細く、理想的にはパターンに従う必要があります。

  1. ドメインエンティティを見つける
  2. ドメインエンティティに作用する
  3. 表示用のデータを準備/結果を返す

さらに、コントローラーにはアプリケーションロジックを含めることができます。

では、ビジネスロジックをどこに配置すればよいのでしょうか?モデルで。

モデルとは?これはいい質問です。 Microsoft Patterns and Practicesの記事 (優れた検索についてはAlejandroRに感謝します)を参照してください。ここには、モデルの3つのカテゴリがあります。

  • ビューモデル:これは、データバッグであり、ビューとの間でデータをやり取りするための最小限のロジックがあり、基本的なフィールド検証が含まれています。
  • ドメインモデル:ビジネスロジックを備えたファットモデル、単一または複数のデータエンティティ(エンティティBのアクションよりも特定の状態のエンティティA)で動作します
  • データモデル:ストレージ対応モデル、単一のエンティティ内に含まれるロジックは、そのエンティティにのみ関連します(つまり、フィールドaがフィールドbの場合)

もちろん、MVCはさまざまな種類のパラダイムです。ここで説明するのは、MVCが最上位レイヤーのみを占有していることです Wikipediaのこの記事

現在、MVCおよび同様のモデルビュープレゼンター(MVP)は、大規模システムのプレゼンテーション層にのみ適用される懸念の分離デザインパターンです。単純なシナリオでは、MVCはシステムの主要な設計を表し、データベースに直接到達します。ただし、ほとんどのシナリオでは、MVCのコントローラーとモデルは、サービスまたはデータレイヤー/層に緩やかに依存しています。これは、すべてクライアントサーバーアーキテクチャに関するものです

8
Jacek Glen