11

ASP.NET MVCは、「関心の分離」というモットーを推進およびサポートしていると主張しており、これは素晴らしいアイデアだと思います。

ただし、コントローラー、モデル、またはビューを独自のアセンブリに分離したり、領域をアセンブリに分離したりする方法はないようです。

ASP.NET MVCの固定フォルダーとフォルダーを使用するとController、実際には、物事の巨大な寄せ集めを作成していることになります。それは関心の分離ですか?私とは正反対のようです。ModelView

だから私が疑問に思っているのは:

  • コントローラー、モデル、およびビューでいっぱいのフォルダーを別々のアセンブリに分離するASP.NET MVCソリューションを作成するにはどうすればよいですか?

  • ASP.NET MVC 2の領域を個別のアセンブリに配置するにはどうすればよいですか?

  • または、他にどのように大規模なASP.NET MVCアプリを管理しますか?数十または100を超えるコントローラー、多数のモデルおよびビューモデルクラス、および数百のビューがありますか?

4

5 に答える 5

8

ASP.NetMVC2でエリアを探していると思います。CSProjファイルにはコメントを外すことがいくつかありますが、その後、ビルド時にビューがコピーされます。ControllerまたはModelクラスがビューと同じアセンブリにある必要はないと思います。

ウォークスルー:複数のプロジェクトを使用したASP.NETMVCエリアアプリケーションの作成

于 2010-04-06T13:58:25.670 に答える
8

コントローラー:コントローラーを独自のアセンブリにスローするために特別なことをする必要はありません。せいぜい、あなたがしなければならないのは、ControllerFactoryのGetControllerTypeメソッドをオーバーライドすることだけです。

モデル:モデルを配置する場所の制限はありません。これは嫌いですが、私は定期的にNhibernate/その他のORMレイヤーまたはWCF/サービスレイヤーのDTOからの永続オブジェクトを使用しています。これらのオブジェクトは、ビューとして別のアセンブリにあります。これは、WebFormsを使用した場合と同じように機能します。

ビュー:別のアセンブリ内のビューを埋め込みリソースとしてマークする必要があります。次に、ファイルシステムではなくリソースからビューを取得する方法を知っている カスタムVirtualPathProviderを使用する必要があります。ファイルシステムではなくリソースからのビュー。繰り返しますが、これはWebForm開発に使用するのとまったく同じ手法です。

mcintyre321と彼のPortableAreas の回答について:リンクされたプロジェクトはほとんどカスタムを行わず、既存のMVC2拡張ポイントをより使いやすい抽象化にまとめるだけです。そのかろうじて「カスタム」で、より構文的な糖衣。

他の大規模なアプリを管理するのと同じように、大規模なMVCアプリを管理します。500ページのWebFormsプロジェクトを開くのは怖いです。なぜなら、これらのコードの背後にあるものが何であるかがよくわからないからです。MVCを使用すると、明確な機能がほとんど適切な場所にあります。それはまったく反対ではありません。

于 2010-04-06T14:20:47.440 に答える
6

コードを個別のアセンブリに分離することは、関心の分離と直交しています。コードが存在する場所は「懸念事項」ではありません。関心の分離は、さまざまなコンポーネントの責任と依存関係の方向性と関係があります。たとえば、ビューは出力のレンダリングを担当し、コントローラーはビューについて知っていますが、ビューは実際にはコントローラーについての深い知識を持っていません。

同様に、モデルはビューとコントローラーのどちらについても何も知りませんが、ビューとコントローラーの両方がモデルについて知っています。

ただし、質問に戻ります。jfarが指摘しているように、コントローラーとモデルを別のアセンブリに移動するのは簡単で、機能します。ビューを別のアセンブリに移動するのは難しいです。カスタム仮想パスプロバイダーを使用した組み込みリソースは1つの方法ですが、高性能サイトに一般的に推奨される方法ではありません。しかし、それがあなたのニーズを満たしているなら、それを選んでください。

于 2010-04-06T15:20:01.563 に答える
1

MVCは非常に拡張性が高く、Controller、View、およびModelフォルダー構造に準拠する必要はありません。コントローラは好きな場所に配置できますが、別のアセンブリに配置されている場合は、その配置方法を知っている独自のコントローラファクトリを実装する必要があります。これは、Windsorを使用してコントローラーを見つけるための例です

モデル/ビューモデルは、どこにでも配置できます。ビューがどこを見ればよいかがわかるように、web.configで名前空間を参照するだけです。(少なくとも、これがSparkビューエンジンに当てはまることはわかっています。)

あなたはあなたの意見をどんなウェブプロジェクトにも入れます。私の通常の戦略は、viewsフォルダーを含むプレーンWeb(非MVC)プロジェクトを作成することです。(これはレガシーWebアプリである可能性もあります!)次に、すべてのコントローラーが個別のクラスライブラリに配置されます。私のビューモデルとサービスは別のものになります。

フォルダの構造化に関しては、通常、階層をドメインの概念に集中させています。各プロジェクトには、ユーザー、製品、注文などのフォルダーがあります。ModelsまたはControllersフォルダーはどこにもありません。

于 2010-04-06T14:24:56.723 に答える
0

ポータブルエリアを使用する必要があります。http://www.lostechies.com/blogs/hex/archive/2009/11/02/asp-net-mvc-portable-areas-part-2.aspxを参照してください。

于 2010-04-06T13:47:11.517 に答える