私はMVCの初心者です。私の知る限り:
ビジネスロジックはどこに行きますか?
大規模なエンタープライズアプリケーションを次のように使用します。
MVC Webアプリケーションが(コードとプロジェクト構造の観点から)この上に位置するための適切な方法は何ですか?
私が見た例では、すべてがModelフォルダーにあるだけで、非常に大規模なアプリケーションには適していないようです。
アドバイスありがとうございます!
私のアプリでは、通常、Webプロジェクトとは別に「コア」プロジェクトを作成します。
コアプロジェクトに含まれる:
Webプロジェクトに含まれる:
ここで重要な点は、WebベースのModelsフォルダー/名前空間は、特定のビューに必要な特定の変数を文書化するプレゼンテーション固有のモデルにのみ使用されるということです。可能な限り多くの「ビジネスロジック」がコアプロジェクトに入ります。
[〜#〜] 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 [〜#〜]を構築するために多くのコードが必要な場合、これはこれはコントローラーの仕事なので、大丈夫です。コントローラにビジネスロジックまたはレンダリングロジックが表示されることがよくあります。それが属する場所に置いてください!
包括性と簡潔さのバランスをとろうとしましたが、あなたは大きな質問をしました!
MVCは、ニーズに合った完全なアーキテクチャではなく、プレゼンテーション層のみを対象としています。コントローラは、モデルオブジェクトを取得するためにビジネスレイヤと通信する必要があります。ビジネス層は、データベースアクセス、Webサービス、ファイルシステムなどの他の層と通信できます。
私は自分のビジネスロジックをサービスに入れ、データをマーシャルして適切なサービスに送信するコントローラーからそれらを呼び出す傾向があります。
この上にMVCアプリケーションを配置するには、ファサードパターンなどを使用して、既存のビジネスロジックへの呼び出しをプロキシします。したがって、サービスは基本的に、既存のビジネスロジックにデータを渡すだけのファサードです。
そうすれば、既存のビジネスロジックと新しいMVCベースのコードの間に明確なブレークがあります。
"場合によります" :)
リクエストはコントローラーにルーティングされ、コントローラーが適切に処理します。コントローラーは、他のすべて(モデル、ビューなど)をまとめる「接着剤」です。したがって、「ビジネスロジック」が直接処理されるか、コントローラによって別のコンポーネントにオフロードされるのは当然です。
実際にロジックを配置する場所は、ニーズによって異なります。ロジックが単一のコントローラーでのみ必要な場合は、ロジックをコントローラーの内部に直接配置することで問題ありません。もちろん、データの整合性のために必要な場合は、ロジックが単一のモデルになることもあります。
または、ヘルパークラス/関数にロジックを配置することも、(他の人が言及しているように)ビジネスロジックのサービスレイヤーを作成することもできます。
S#arp Architecture を使用して、ベストプラクティスを使用してアプリケーションを適切に構造化できます。包括的なサンプルアプリケーションは次の場所で入手できます。 Who Can Help Me?
おそらくこれ link は、モデルをよりよく理解するのに役立ちます。これらは、データ転送オブジェクトの役割を果たすことも、リンクで説明されているようにさらに詳細にすることもできます。しかし、私の意見では、それらをDALにするべきではありません。私が見る多くの例は、サービスとリポジトリのパターンでビジネスロジックとDALを処理します。
MVC Contrib Project とコードキャンプのサンプルをチェックして、この例を取得してください。
また、Rob Coneryの eコマースストアフロント と Northwind MVCスターターキット が役に立ちました。
IMOこのシナリオは、WPFで使用するようなものに適しています。 ViewModelビューコントローラー。
コントローラは、ドメインオブジェクトで機能を実行するビジネスサービスと通信します。コントローラは、ビジネスサービスから返されたデータ(必要に応じていくつかを組み合わせたもの)をビューモデル(MVCの「M」)に変換します。次に、ビューモデルがビューに渡されます。
逆に、VMをビューから取得し、データをビジネスサービスに送り返す場合も同様です。