2011-01-29 14 views
0

私はMEF、MAF、Unityと失われたビットをよ...C#.NET 4.0フォームのプラグインマネージャ

この質問は、Winフォームアプリケーションのアーキテクチャについてです。

メインフォームとその他のフォームを含むメインプロジェクトがあります。

モジュール化度を含めるので、私はプラグインシステムの使用を考えています。

主な用途は、ツールバーのボタンでそれぞれを参照するために開かれたときに私は何をしたいことは各プラグインのDLLを開いている...

その後、私は彼らが呼ばれるまでにそれらを配置したいと思います。

しかし、私はすべてのプラグインがメモリに保存されることを望んでいません。ちょうどいいアーキテクチャモデルが得られました。

だから、.NETに関する最初: んDOTNETは、メモリ内のDLLプラグインや、すべてのプラグインコードにのみ参照を保ちますか?

私はインポートのLAZYコレクションでMEFを使用したと思って、しかし、私は私のボタンの情報を取得するには、最初にそれらのインスタンスを作成する必要があります。私はnullにインポートコレクションを設定して、再度compose()機能を出せそうであれば

2つ目の質問は、プラグインは、負荷であるか、または負荷(怠け者)であることを呼び出しまで待つのだろうか?

+0

あなたの質問に言い換えてみてください。少し混乱して一般的に見えます。 – tomfanning

+0

それは良いですか?申し訳ありません本当に分かりませんでした – guillaume

答えて

2

次に、呼び出されるまで処分したいと思います。

インポートされたオブジェクトを検査してから投げ捨てる代わりに、インポートmetadataを検査する必要があります。このメタデータは、Lazy<IFoo,IFooMetadata>またはLazy<IFoo,Dictionary<string,object>>をインポートして取得できます。このメタデータは、ExportMetadata属性を持つエクスポートに追加できます。

.NETについて:dotNetは、メモリ内のdllプラグインまたはすべてのプラグインコードへの参照のみを保持しますか?

アセンブリが読み込まれると、AppDomain全体をアンロードしない限り、アセンブリがロードされます。

また、対応するアセンブリをロードせずに照会できる.NET 4.0には、ComposablePartCatalogの既定の実装はありません。しかし、理論的には、アセンブリの外側のどこかにメタデータを格納すると、そのようなことが起こる可能性があります。 MEF code on codeplexにそのような実装のサンプルがあります。

私は必ずしもロードされてからアセンブリを防ぐことはできません怠惰な輸入品を使用してインポート

のLAZYコレクションにMEFを使用したと思っています。Lazy<IFoo>オブジェクトへの参照がある場合、少なくともIFooを含むアセンブリをロードする必要があります。上で説明したように、エクスポートされたIFoo実装を含むアセンブリもその時点でロードされています。

Lazyを使用すると、一部のコンストラクタの呼び出しが延期されるだけで、アプリケーションの起動が早くなることがあります。