11

私は現在、あまりモジュール化されていない既存のASP.NETMVC3.0アプリケーションのアーキテクチャを再構築する方法を考えています。既存のプロジェクトを拡張可能にするために、構造のようなプラグインを念頭に置いています。

モジュラーWebアプリケーションを作成するためのさまざまな戦略を検索し、次のことを見つけました。これらのアイデアについてコメントしていただきたいと思います。

  • 別のプロジェクトのMVCエリア

プラグインごとに、プラグインのコントローラー、ビュー、およびビューモデルを含む個別のASP.NETMVCプロジェクトを作成します。「従業員」モジュールには、従業員を一覧表示、作成、更新、および削除するための領域が含まれます。ただし、これは良さそうです。すべての領域を「bin」ディレクトリに配置するには、AreaRegistrationが必要です。AreaプロジェクトをAreasフォルダーに直接配置し、「/ Areas / [AreaName]/bin」フォルダーからAreaアセンブリを解決する方法を見つけました。

BuildManager.AddReferencedAssembly.Add(Assembly.LoadFrom(…));
AppDomain.CurrentDomain.AssemblyResolve += ResolveAssemblies;

これは非常にうまく機能しており、メインプロジェクトのAreasフォルダーにプラグインをデプロイできます。ASP.NETMVCによってすぐに提供されるエリア機能を使用しているのが好きです。

  • MVCポータブルエリア(MVCContrib)

http://elegantcode.com/2012/04/06/mvc-portable-areas/

ポータブルエリアは、ビューがエリアプロジェクトファイルに埋め込まれたリソースとしてコンパイルされる必要があるため、適切なアプローチではないようです。これにより、IISのキャッシュが妨げられます。一方で、パフォーマンスの欠点が実際にどれほど大きいかは想像できません。

  • MEFを使用したMVCベースのモジュール

http://www.fidelitydesign.net/?p=104

他のプロジェクトで疎結合サービスを作成するために、私はMEFに大きく依存しています。したがって、ASP.NETMVCモジュール/プラグインを検出するためにそれを使用するのは素晴らしいアイデアだと思いました。'Export'属性を使用してエクスポートされたコントローラーをインスタンス化するControllerFactoryを使用することになります。このようにして、プラグインのインスタンス化を完全に制御し、MEFを使用してサービスを取得できます。ただし、MEFを使用するには、コントローラーをすぐに解決するMVCエリアを使用するよりもはるかに多くの作業が必要になります。

  • プラグインプロジェクト全体のエンティティフレームワーク

これまで解決できなかった問題の1つは、個々のプラグインプロジェクトにエンティティをどのように分散させるかです。現在、すべてのエンティティを含む1つの*.edmxモデルファイルで構成されるデータベースファーストアプローチを使用しています。DbContextまたはCodeFirstを使用しても、1つのデータベースに複数のDbContextクラスを使用することはできません。1つのアイデアは、MEFを使用して、さまざまなプラグインから中央のDbContextクラスにエンティティをロードすることです。ただし、これがサポートされているセットアップであるか、推奨されるセットアップであるかはわかりません。

4

1 に答える 1

4

もう1つのオプションは、Griffin.MvcContribを使用することです。すべての配管を処理し、コードをほとんど変更せずにビューを記述して領域を使用できるようにします。

IoCコンテナと一緒に使用して、強力なプラグインシステムを入手してください。

これがその方法を示す記事です:http://www.codeproject.com/Articles/386674/ASP-NET-MVC-3-plug-in-architecture-using-Griffin-M

于 2012-08-27T05:55:49.113 に答える