15

私は、アプリケーションが使用する必要のあるデータアクセス層の実装を解決するために、WebベースのアプリケーションにWindsorIoCコンテナを使用しています。

WebアプリケーションのUIはページで構成され、各ページはポートレットと呼ばれる小さなユニットで構成されます。(それらの概念はウィジェットにいくぶん似ています。)これらのいわゆるポートレットは基本的にWebコントロールであり、実行時にすべてのページに対して個別に構成できます。

アプリケーションにはこれらの組み込みの一部が付属していますが、簡単に拡張できるようにしたいと思います。

このメカニズムがまさにMEFの目的であることがわかりました。そこで、MEFを使用してポートレットを検出するようにシステムを実装することにしました。そして、現在ウィンザーを使っていることもできることに気づいたので、ウィンザーを捨ててMEFを選ぶことにしました。

明らかに、DirectoryCatalogを使用する必要があります。これは、アプリのbinフォルダー内の.dllをスキャンし、必要なものをすべて返します。

StackOverflowのMEFに関するいくつかのチュートリアル、例、およびすべての質問も読みました。MEFを使用する最も簡単な方法は、Glenn Blockがチュートリアルで言及したPartInitializerを使用することであると考えましたが、MEFにはないことに気付きました。実際、それは私がCodePlexからダウンロードしたコードにありますが、別のアセンブリにあり、ソースのみであり、バイナリ形式ではありません。(これは、MEFの一部ではないという意味ですか?それとも、別のプロジェクトに配置する意味は何ですか?)次に、Silverlight用であることに気付いたので、あまり役に立ちません。(または、それを.NET 3.5に対してコンパイルするか、プロジェクトに含める必要があります。これで問題ありませんか?)

だから今私は次のような問題を抱えています:CompositionContainerをアプリケーションのどこに置くべきですか?

もう1つ考慮したいことがあります。アプリの存続期間中に、CompositionContainerを1つだけ使用する必要がありますか、それとも、必要なときに毎回コンテナーを作成する方がよいでしょうか。

4

1 に答える 1

11

良い質問です。

一般的に、コンテナを配置する場所に関する質問に関しては、次の投稿をお勧めします: http://blogs.msdn.com/nblumhardt/archive/tags/Container+Managed+Application+Design/default.aspx

Web 上の MEF では、要求/応答の性質とスケーラビリティの問題から、Web ベースのアプリは少しトリッキーです。Web の場合、コンテナーの階層、共有されるアプリケーション用の 1 つのルート、および要求ごとの子コンテナーが必要になる可能性があります。リソースを節約するために、子コンテナはリクエストに応じて存続および停止する必要があります。共有コンテナーには、すべての呼び出し元によって共有されるサービスが含まれています。

これを行う方法の詳細については、次の記事をご覧ください。

http://blogs.msdn.com/hammett/archive/2009/04/23/mef-and-asp-net-mvc-sample.aspx http://blogs.msdn.com/hammett/archive/2009/07 /15/mef-and-asp-net-mvc-sample-updated.aspx http://mef.codeplex.com/wikipage?title=Parts%20Lifetime&referringTitle=ガイド

PartInitializer に関しては、必要がない限り、そのようなものを使用することは避けます。ASP.NET は、作成時に自動的に構成できるように、HTTP ハンドラー、モジュールなどを介してパイプラインに十分なフックを提供します。

Web 上で PI を使用する唯一の場所は、カスタム ユーザー コントロール内にある可能性があります。PI は Silverlight 4 の一部として出荷され、.NET 4.0 のボックスには含まれていません。ここで見つけることができる .NET 4.0 の使用可能なバージョンを作成しました: http://cid-f8b2fd72406fb218.skydrive.live.com/self.aspx/blog/Composition.Initialization.Desktop.zip

HTHグレン

于 2009-12-22T18:16:15.313 に答える