C#.NET 4.0フォームプラグインマネージャー
質問
私はMEF、MAF、UNITYで少し迷子になりました...
この質問は、Winformアプリケーションのアーキテクチャに関するものです。
メインフォームと他のフォームを含むメインプロジェクトがあります。
含めたいので モジュール性, 、プラグインシステムを使用することを考えています。
私がしたいのはです 各プラグインDLLを開きます メインアプリケーションが開いている場合、各ボタンを使用して各アプリケーションを参照してください。ツールバー...
それから私はしたいです 廃棄 彼らが呼ばれるまでそれら。
しかし、私はすべてのプラグインをメモリに保持することを望んでいません。
だから最初に.netについて:dotnetは 参照 メモリまたはすべてのDLLプラグインに プラグインコード ?
MEFを使用することを考えています LAZY
インポートのコレクションですが、ボタンの情報を取得するには、最初にそれらをインスタンス化する必要があります。だから2番目の質問
インポートコレクションをに設定した場合 null
そしてラウチ compose
() 再び機能しますが、プラグインはロードされますか、それとも呼び出しがロードされるまで待ちます(怠け者)?
解決
それから私はそれらが呼ばれるまでそれらを処分したいと思います。
インポートされたオブジェクトを検査してから捨てる代わりに、インポートを検査する必要があります メタデータ. 。インポートすることでこのメタデータを入手できます Lazy<IFoo,IFooMetadata>
また Lazy<IFoo,Dictionary<string,object>>
. 。このメタデータを追加することができます ExportMetadata
属性。
最初に.NETについて:DotNetは、メモリまたはすべてのプラグインコードのDLLプラグインへの参照のみを保持しますか?
アセンブリがロードされると、AppDomain全体を降ろさない限り、メモリに残ります。
また、すぐに使用できる実装はありません ComposablePartCatalog
.NET 4.0では、対応するアセンブリをロードせずに照会できます。しかし、理論的には、メタデータをアセンブリの外側に保管すると、そのようなことができます。そのような実装のサンプルがあります CodePlexのMEFコード.
怠zyなインポートコレクションでMEFを使用することを考えています
怠zyな輸入品を使用しても、アセンブリがロードされるのを防ぐとは限りません。 aへの参照がある場合 Lazy<IFoo>
オブジェクト、そして少なくともアセンブリを含む IFoo
ロードする必要があります。そして、上で説明したように、輸出を含むアセンブリ IFoo
その時点でも実装がロードされます。
Lazyを使用すると、一部のコンストラクターの呼び出しが延期されるだけで、アプリケーションのスタートアップが速くなることを願っています。