web-dev-qa-db-ja.com

エンタープライズMVCアプリを構築する方法と、ビジネスロジックはどこに行きますか?

私はMVCの初心者です。私の知る限り:

  • コントローラー:ルーティングリクエストを処理します
  • 表示:データの表示を扱います
  • モデル:データアクセス層によく似ています

ビジネスロジックはどこに行きますか?

大規模なエンタープライズアプリケーションを次のように使用します。

  • (複数の異なるDTOを使用して)データアクセス層で結合されたいくつかの異なるデータソース(WCF、WebServices、およびADO)。
  • いくつかのdllに分割された多くのビジネスロジック。

MVC Webアプリケーションが(コードとプロジェクト構造の観点から)この上に位置するための適切な方法は何ですか?

私が見た例では、すべてがModelフォルダーにあるだけで、非常に大規模なアプリケーションには適していないようです。

アドバイスありがとうございます!

37
James

私のアプリでは、通常、Webプロジェクトとは別に「コア」プロジェクトを作成します。

コアプロジェクトに含まれる

  1. エンティティなどのビジネスオブジェクト
  2. データアクセス
  3. Web用に特別に設計されたものではないもの

Webプロジェクトに含まれる

  1. Controllers、UIからコアロジックにリクエストをルーティングします
  2. ビュー、HTMLでのデータの表示に焦点を当てています
  3. ビューモデル、コアビジネスオブジェクトを特定のビューをサポートするように設計されたより単純な構造にフラット化/変換します

ここで重要な点は、WebベースのModelsフォルダー/名前空間は、特定のビューに必要な特定の変数を文書化するプレゼンテーション固有のモデルにのみ使用されるということです。可能な限り多くの「ビジネスロジック」がコアプロジェクトに入ります。

26

[〜#〜] m [〜#〜]odel[〜#〜] v [〜#〜] iew[〜#〜] c [〜#〜]ontrollerは、3つの層に対応しているように聞こえますが、それはそうではありません。 UIをどのように組み合わせるかを実際に整理します。コントローラーは中央にあり、通常(A)は[〜#〜] b [〜#〜]usinessオブジェクトを使用して処理を実行します(B) from[〜#〜] b [〜#〜]usinessオブジェクトは[〜#〜] m [を取得します〜#〜][〜#〜] v [〜#〜]iewに渡すodelオブジェクト。システムのMVC部分(UI機能)は、ビジネスレイヤーの反対側で何が起こっているのかわかりません。 DB?サービスコール?ディスクIO?レーザーを発射しますか?したがって、MVC-B-?は、MVC andの接続方法を説明する頭字語になります。

中央にある[〜#〜] c [〜#〜]コントローラーについて考えてみてください。線はdown to [〜#〜] b [〜#〜]usinessオブジェクト。コントローラは通常、[〜#〜] m [〜#〜]odelを[〜#から取得します。 〜] b [〜#〜]usinessオブジェクトを[〜#〜] v [〜#〜]iewですが、[〜#〜] m [〜#〜]odelは単なるデータです。それが鍵です。 [〜#〜] c [〜#〜]ontrollerは、ある意味でシステムのsmartest部分になりました。しかし、[〜#〜] b [〜#〜]usinessオブジェクトは依然として最も強力です。

したがって、[〜#〜] m [〜#〜]odelオブジェクトは、[〜#〜] c [〜#〜]コントローラーと[〜#〜] b [〜#〜]usinessオブジェクト。さらに、すべてのビューには[〜#〜] vm [〜#〜][〜#〜]がありますv [〜#〜]iew[〜#〜] m [〜#〜]odel)取る、それは[〜#〜] m [〜#〜]odelかもしれませんが、[〜#〜] c [〜#〜]ontrollerは、より複雑な情報のセットを[〜#〜] v [〜 #〜]iew。

したがって、コントローラー(1)はクライアントからデータを取得し、(必要に応じて)ビジネスオブジェクトを処理し、おそらくモデルオブジェクトを使用して通信します。 (2)get's[〜#〜] m [〜#〜][〜#〜] b [〜#〜]usinessオブジェクトからのodelオブジェクトは、[〜#〜] vm [〜#〜]、それをビュー(場合によっては複数)に渡してレンダリングします。

特にMVCに入るのは、インターフェイスの使用を増やす良い機会であるため(最後の3または4を参照 ソリッドプリンシパル )、 ユニットテスト 。プロジェクトには、他の方法よりも多くのfilesが含まれている可能性があります。非常に迅速にわかりますが、それは実際には物事を整理するための優れた方法です。

システムのこの「トップ」部分であるMVC部分として、[〜#〜] m [〜#〜] odelオブジェクトが構築されたか、[〜#〜] b [〜#〜]usinessオブジェクトがそれらを使用して何をするか。もちろん、CustomerモデルオブジェクトがたまたまあなたのCustomers dbテーブルによく似ていても驚かないでください!これは正常で一般的です。ただし、顧客[〜#〜] m [〜#〜]odelオブジェクトと顧客[〜# 〜] b [〜#〜]usinessオブジェクトは実際には別々のライフを持​​ちます。 リポジトリパターン を検討する良い機会です。

怠惰になる誘惑と戦い、[〜#〜] c [〜#〜]コントローラーに多くのロジックを入れます。彼らが下にある場所に懸念を置くためにあらゆる瞬間に努力してください。 [〜#〜] c [〜#〜]コントローラーは、物事を配線するためだけのものです。ビューが使用するのに適切な[〜#〜] vm [〜#〜]を構築するために多くのコードが必要な場合、これはこれはコントローラーの仕事なので、大丈夫です。コントローラにビジネスロジックまたはレンダリングロジックが表示されることがよくあります。それが属する場所に置いてください!

包括性と簡潔さのバランスをとろうとしましたが、あなたは大きな質問をしました!

15
Patrick Karcher

MVCは、ニーズに合った完全なアーキテクチャではなく、プレゼンテーション層のみを対象としています。コントローラは、モデルオブジェクトを取得するためにビジネスレイヤと通信する必要があります。ビジネス層は、データベースアクセス、Webサービス、ファイルシステムなどの他の層と通信できます。

9
Max Toro

私は自分のビジネスロジックをサービスに入れ、データをマーシャルして適切なサービスに送信するコントローラーからそれらを呼び出す傾向があります。

この上にMVCアプリケーションを配置するには、ファサードパターンなどを使用して、既存のビジネスロジックへの呼び出しをプロキシします。したがって、サービスは基本的に、既存のビジネスロジックにデータを渡すだけのファサードです。

そうすれば、既存のビジネスロジックと新しいMVCベースのコードの間に明確なブレークがあります。

3
Vivin Paliath

"場合によります" :)

リクエストはコントローラーにルーティングされ、コントローラーが適切に処理します。コントローラーは、他のすべて(モデル、ビューなど)をまとめる「接着剤」です。したがって、「ビジネスロジック」が直接処理されるか、コントローラによって別のコンポーネントにオフロードされるのは当然です。

実際にロジックを配置する場所は、ニーズによって異なります。ロジックが単一のコントローラーでのみ必要な場合は、ロジックをコントローラーの内部に直接配置することで問題ありません。もちろん、データの整合性のために必要な場合は、ロジックが単一のモデルになることもあります。

または、ヘルパークラス/関数にロジックを配置することも、(他の人が言及しているように)ビジネスロジックのサービスレイヤーを作成することもできます。

1
Justin Ethier

S#arp Architecture を使用して、ベストプラクティスを使用してアプリケーションを適切に構造化できます。包括的なサンプルアプリケーションは次の場所で入手できます。 Who Can Help Me?

1
Giorgi

おそらくこれ link は、モデルをよりよく理解するのに役立ちます。これらは、データ転送オブジェクトの役割を果たすことも、リンクで説明されているようにさらに詳細にすることもできます。しかし、私の意見では、それらをDALにするべきではありません。私が見る多くの例は、サービスとリポジトリのパターンでビジネスロジックとDALを処理します。

MVC Contrib Project とコードキャンプのサンプルをチェックして、この例を取得してください。

また、Rob Coneryの eコマースストアフロントNorthwind MVCスターターキット が役に立ちました。

0
Kevin LaBranche

IMOこのシナリオは、WPFで使用するようなものに適しています。 ViewModelビューコントローラー。

コントローラは、ドメインオブジェクトで機能を実行するビジネスサービスと通信します。コントローラは、ビジネスサービスから返されたデータ(必要に応じていくつかを組み合わせたもの)をビューモデル(MVCの「M」)に変換します。次に、ビューモデルがビューに渡されます。

逆に、VMをビューから取得し、データをビジネスサービスに送り返す場合も同様です。

0
GrahamB