0

MEF、MAF、Unityでちょっと迷ってます…

この質問は、Winform アプリケーションのアーキテクチャに関するものです。

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

モジュール性を盛り込みたいので、プラグインシステムの利用を考えています。

私がやりたいことは、メインアプリケーションが開いているときに各プラグインDLLを開いて、ボタン、ツールバーでそれぞれを参照することです...

それでは呼ばれるまで処分したいと思います。

しかし、私はすべてのプラグインをメモリに保持したくありません..良いアーキテクチャモデルを取得するためだけに.

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

LAZYImport のコレクションでMEF を使用することを考えていますが、ボタン情報を取得するために最初にそれらをインスタンス化する必要があります。では、2つ目の質問

Import Collection を に設定して()null関数を再度起動すると、プラグインがロードされるか、ロードされるまで待機します (遅延) ?compose

4

1 に答える 1

2

では、呼ばれるまで処分したいと思います。

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

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

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

また、ComposablePartCatalog.NET 4.0 には、対応するアセンブリを読み込まずにクエリを実行できる、すぐに使用できる実装はありません。しかし、理論的には、メタデータをアセンブリの外のどこかに保存すれば、そのようなことを行うことができます。codeplexの MEF コードに、このような実装のサンプルがあります。

ImportのLAZYコレクションでMEFを使おうと思っている

遅延インポートを使用しても、必ずしもアセンブリの読み込みが妨げられるわけではありません。オブジェクトへの参照があるLazy<IFoo>場合、少なくともそれを含むアセンブリをIFooロードする必要があります。上で説明したように、エクスポートされた実装を含むアセンブリIFooもその時点で読み込まれます。

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

于 2011-01-29T18:16:01.137 に答える