ASP.NET MVC-コントローラーにビジネスロジックが存在する必要がありますか?
-
04-07-2019 - |
他のヒント
Microsoftパターン&プラクティス。そして、「写真は千の言葉に値する」という格言を信じています。
これは興味深い質問です。
興味深いのは、多数のサンプルMVCアプリケーションが、実際に「ビジネスロジック」を配置するという意味でMVCパラダイムに従わないことです。完全にモデル内。 Martin Fowlerは、MVCはGang Of Fourの意味でのパターンではないことを指摘しています。むしろ、プログラマーがおもちゃのアプリを超えて何かを作成している場合、 にパターンを追加する必要があるというのがパラダイムです。
つまり、簡単な答えは、「ビジネスロジック」ということです。コントローラーにはビューとユーザーインタラクションを処理する機能が追加されており、1つの目的だけでオブジェクトを作成するため、コントローラーに実際に存在するべきではありません。
より長い答えは、ロジックをコントローラーからモデルに移動する前に、モデルレイヤーの設計にいくつかの考えを入れる必要があるということです。おそらく、RESTを使用してすべてのアプリロジックを処理できます。その場合、モデルの設計はかなり明確でなければなりません。そうでない場合は、モデルが肥大化しないようにするためにどのアプローチを使用するかを知っておく必要があります。
検証を移動する方法を学ぶ コントローラーアクションのロジック そして別のサービス層に。に このチュートリアル、Stephen Walther シャープを維持する方法を説明します 分離による懸念の分離 あなたのサービス層 コントローラー層。
コントローラにビジネスロジックを含めないでください。コントローラーはできる限り細く、理想的にはパターンに従う必要があります:
- ドメインエンティティの検索
- ドメインエンティティに対する行為
- 表示/結果を返すためのデータの準備
さらに、コントローラーにはアプリケーションロジックを含めることができます。
では、ビジネスロジックをどこに配置しますか?モデル内。
モデルとは?これはいい質問です。 Microsoft Patterns and Practicesの記事(優れた検索結果についてはAlejandroRに感謝します)を参照してください。ここには、モデルの3つのカテゴリがあります:
- ビューモデル:これは単なるデータバッグであり、ビューとの間でデータをやり取りする最小限のロジック(存在する場合)には基本的なフィールド検証が含まれます。
- ドメインモデル:ビジネスロジックを備えたファットモデル、単一または複数のデータエンティティ(エンティティBのアクションよりも特定の状態のエンティティA)で動作します
- データモデル:ストレージ対応モデル。単一のエンティティに含まれるロジックは、そのエンティティのみに関連します(つまり、フィールドaがフィールドbの場合)
もちろん、MVCはさまざまな種類のパラダイムです。ここで説明するのは、MVCが最上層のみを占有していることです。 Wikipediaのこの記事
今日、MVCおよび同様のモデルビュープレゼンター(MVP)は、大規模システムのプレゼンテーションレイヤーにのみ適用される懸念の分離デザインパターンです。単純なシナリオでは、MVCはシステムの主要な設計を表し、データベースに直接到達します。ただし、ほとんどのシナリオでは、MVCのコントローラーとモデルは、サービスまたはデータレイヤー/層に緩やかに依存しています。これはすべてクライアントサーバーアーキテクチャについてです
依存関係インジェクターを使用すると、ビジネスロジックがそれらに移動するため、きちんとしたクリーンなコントローラーが得られます。