[解決済み] ファットモデル・シンコントローラー vs. サービスレイヤー【終了しました
質問
私は長年にわたって、.Net を使用してエンタープライズアプリケーションを開発してきました。 私のアプリは通常、SQL DBテーブルにマッピングされたエンティティを含むドメインモデルを持っています。 私は、リポジトリパターン、依存性注入、およびサービスレイヤーを使用しています。
最近、私たちは MVC 3 プロジェクトに取り組み始め、どこにどのロジックを配置するかについて議論しました。 私は薄いコントローラ / FAT モデル アーキテクチャに出会い、サービス層がどのように適合するのか不思議に思っていました。
オプション 1 - サービスと対話するモデル
コントローラは薄く、モデル上のメソッドを呼び出します。モデルはDBから自分自身をロードする方法を知っており、リポジトリやサービスと対話します。 例えば、customerModel は Load(id) メソッドを持ち、顧客と GetContracts() のようないくつかの子オブジェクトをロードします。
オプション 2 - サービスと対話するコントローラ
コントローラはサービスにモデルオブジェクトを取得するよう依頼します。読み込み/保存などのロジックはサービス層にあります。サービス層にあります。モデルはデータのみの純粋なエンティティモデルです。
特にエンタープライズアプリケーションについて話すとき、なぜオプション1が良い選択なのでしょうか?私の経験では、関心事を分離し、モデルやコントローラをできるだけ薄く保ち、ビジネスロジック(DBのやり取りなど)を行う専門サービスを持つようにします。
すべてのアドバイスと良いリソースの参照に感謝します。
どのように解決するのですか?
これらはすべて、アプリケーションの意図と要件に依存します。
とはいえ、中規模(地元のレストランでもなく、TwitterやFacebookでもない)のWebアプリケーションに対する私の提案は以下のとおりです。
-
リーンドメインモデリング
ドライPOCOスタイルのオブジェクトは、可能な限り特定の実装から疎結合のままにするために、WebアプリケーションのMVCアーキテクチャに無知であることが望ましいです。)
MVC におけるモデルとは、正確には次のような意味です。 コントローラが認識するモデル であり、したがって はビューのために意図されたモデル .
小さい(しばしばチュートリアル)アプリケーションでは、quot;アプリケーション/ドメインモデル層"のエンティティモデルは、しばしばコントローラがビューに出荷するオブジェクトと同じインスタンス化されたものです。
大規模なアプリケーションでは、開発者はしばしば MVVM アーキテクチャの教義を採用し、個別のビューモデルオブジェクトを使用するようになります。コントローラは、しばしば、下の見えないエンティティで動作する中間層のサービスを呼び出します。このシナリオでは、MVCのMは、最も正確にビューモデルを意味します。
-
堅牢なサービス層
これは 肥満 ロジックを意味するのではなく、よく書かれた単一の目的のサービスを意味します。ビジネスロジックをモデルの外のサービスでコーディングすることは、純粋なOOPよりも少し手続き的ですが、疎結合、テスト、および柔軟な展開(N層展開など)に大いに役立ちます。
私の個人的な実践では、私は、POCOオブジェクトの行動モデリング(永続化の仕組み、低レベルの検証など)を考慮するデータ層と、MVCの仕組みに近い高レベルのサービス(ビジネス/ワークフロー機能)の両方でサービスをコーディングしています。
-
リーンコン トローラ
私は自分のコントローラが単に コーチ でもないという点で プレー (サービス) でも プレーヤー (エンティティモデルやビューモデル)ではなく、単に誰がどのポジションでどんなプレイをするかを決定します。私のコントローラは2つのことをします。
-
エンティティ/ドメインと相互作用するサービスを呼び出す モデル
-
適切なViewのためのView Modelを用意する。
認証/認可されたコントローラのアクションも、インジェクションされたサービス/属性を通じて行われます。
-
EDIT 1:
これは、あなたのエンティティ/ドメインモデルが貧弱である、または貧弱でなければならないことを意味するものではないことに留意してください。ORM、リポジトリ、ファクトリー、検証、または状態の仕組みは歓迎されます。これは、中程度の規模のアプリケーションでは モデル をMVCで表すと コントローラのためのモデルで、ビューに渡すためのものです。 .
この指摘が、を信じるFowlerの使徒たちを落ち着かせることを期待します。 貧弱なデータモデル であると信じている アンチパターン . 同時に、それは は は、モデル化されたクラスに振る舞いを含めることがより純粋である、OOPよりもわずかに手続き的な角度を反映しています。
究極の真実はありませんが、このパターンを使えば、多くの再利用性と拡張性を維持しながら、アプリケーションの構築、テスト、デプロイが簡単にできることがわかるでしょう。
EDIT 2:
とはいえ、中規模のアプリケーションであっても、システムを過剰にアーキテクトする(オタクが作った言葉か?たとえば、ORM をリポジトリ パターンでラップし、リポジトリを使用するサービスを書く......これらはすべて、関心の分離などには適していますが、プロジェクトで必要ない (そして、そうでない) 場合は すぐに を必要としない(そしてを必要とする可能性がない)プロジェクトは、ビルドしないでください。リポジトリを完全にスキップしたり、ORMに対して薄いビジネスサービス(例えばクエリクラス)を書いたり、あるいはコントローラが直接リポジトリと話すようにしても何も問題はありません。すべては規模に依存します。
EDIT 3:
この説明とアドバイスは、ASP.NetのようなサーバーサイドのMVCアーキテクチャのコンテキストに対するものであり、KnockoutやBackboneのようなクレントサイドのフレームワークに対するものではないことに注意したいと思います。
関連
-
[解決済み] ファイルまたはアセンブリ 'System.Web.Mvc' を読み込めませんでした。
-
[解決済み] System.Web.HttpException (0x80004005)。リクエストの最大長を超えました
-
[解決済み] ルート値を含むURL.Action()
-
[解決済み] RedirectToActionでURLが変更されない、またはIndexビューに移動しない
-
[解決済み] モデルデータや振る舞いをどこに置くか?[tl; dr; サービスを利用する]
-
[解決済み] ASP.NET MVCでHTML-5のdata-*属性でダッシュを使用する方法
-
[解決済み】サービスは常にDTOを返すべきですか、それともドメインモデルも返すことができますか?
-
[解決済み] ASP.NET MVCでリクエストスロットルを実装するための最良の方法は?
-
[解決済み】ViewModelのベストプラクティス
-
[解決済み] 太ったモデルと痩せたコントローラーは、まるで神モデルを作っているようだ。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] HTTPヘッダを送信した後、サーバーがステータスを設定できない IIS7.5
-
[解決済み] JsonResultが特殊文字(apostrophe)を \u0027 としてパースしています。
-
[解決済み] MVC 3 - 辞書に渡されたモデル項目の型は 'System.Collections.Generic.List`1 です。
-
[解決済み] RedirectToActionでURLが変更されない、またはIndexビューに移動しない
-
[解決済み] ASP.Net MVCのmodelStateからすべてのエラーを取得する方法は?
-
[解決済み】1つのビューに複数のモデルを表示する
-
[解決済み】MVC 4 Razor ファイルアップロード
-
[解決済み】cshtmlテンプレートで関数を作成する方法は?
-
[解決済み] HTMLヘルパーでURLを生成する
-
[解決済み] Visual Studio 2012 または Visual Studio 2013 で古い MVC プロジェクトを開くにはどうすればよいですか?