2

MVC 3 に基づくソリューションを拡張中です。

基本的に、このソリューションは、MVC 3 プロジェクトと、ビジネス/データ アクセスを管理するためのいくつかのクラス ライブラリ プロジェクトで構成されます。

MEF を使用してアプリケーションをプラグインベースにしようとしています。たとえば、UserManagerdll プロジェクトにクラスがあり、次のようにプラグインを定義しています。

[ImportMany]public List<IUserHooks> Plugins {get; set;}
foreach (var plugin in Plugins)
{
    Plugin.DoTheJob();
}

ご覧のとおり、クラスは MVC プロジェクトとコントローラーから分離されています。リストは私のUserManagerクラスで定義されています。

MEF も使用するのが最善の方法であることはわかってUserManagerいます (おそらくコントローラーの ctor のように初期化しますpublic MainController(IUserManager UserManager))。

containerMEFオブジェクトをクラス ライブラリで使用できるようにするには、どのように定義すればよいですか。MEFも使ってMVCアプリケーションを作る必要はありますか?私は、MVC アプリケーションに最小限の変更が必要なアプローチを好みます。

4

1 に答える 1

2

MVC3は、サービスロケーションのサポートに組み込まれています。一部の基本クラスを再定義したくないが、単に拡張したい場合は、IDependencyResolverMEFを使用するのインスタンスを追加できます。そうすれば、それをベースとして使用してアプリケーションを拡張できます。私は自分のブログに例を書きました。

MVC3の組み込みアーキテクチャを使用するCompositionContainerと、スタートアップでを構成し、インフラストラクチャの残りの部分に公開できます。

しかし、現実には、おそらくライブラリ内のコンテナを公開したくないでしょう。実際、あなたがしなければならない唯一のことは、単にあなたの輸出をマークすることです。MEFでこれを回避できる理由は、MEFがBCL for.NET4.0に含まれているためです。クラスをMEFに結合しない(または実際には、クラスをサービスロケーターまたは制御の反転コンテナに結合しない)ことで、コードの移植性、テスト可能性、および分離性が向上します。

于 2012-04-22T20:55:35.453 に答える