1

ディレクトリからいくつかのdll(プラグイン)をロードするMEFの簡単な実装がありました。これは MEF1 でうまく動作していましたが、同じ機能を MEF2 で使用したいと思います。これにより、ディレクトリ内にあるがすべてのアセンブリが同じ dll の正しい数を含む IEnumerable が得られます。

たとえば、ディレクトリに fakeplugin1.dll と fakeplugin2.dll という 2 つのアセンブリがあります。FakePlugin1 および FakePlugin2 クラスをエクスポートします。今、container.ComposeParts() を呼び出すと、ImportMany で装飾されたリストには何もありません。container.Catalog にはディレクトリに 2 つのアセンブリが含まれていますが、どちらも FakePlugin1 です。

コードは次のとおりです。

[ImportMany(typeof (IDCPlugin))]
        IEnumerable<IDCPlugin> workplaceControllers;
var catalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory);
var agcatalogue = new AggregateCatalog(catalog);
var container = new CompositionContainer(agcatalogue);
container.ComposeParts();

ExportFactory と RegistrationBuilder を使用しようとしていますが、基本機能でさえ期待どおりに機能しないことに気付きました。

私は何を間違っていますか?MEF2 で何か変更がありましたか? 2 つの異なるアセンブリを読み込む方法は? :)

事前にご協力いただきありがとうございます。

編集: フォルダー内に最初のタイプの2つのインスタンスを常に作成します(abcで昇順)。フォルダーに別のものを入れると、同じものが3つ作成されます。

編集: MEF2 で同じ結果が得られるコードをペーストビンにアップロードしました: http://pastebin.com/3fWcujPS

4

1 に答える 1

1

カタログには、検出されたすべてのインポートおよびエクスポート定義が含まれます。実際に必要かどうかに関係なく。

これは MEF の「機能」です。必要ImportManyなプラグインを選択的にフィルタリングする必要があります。

では、複数のプラグインを適切に処理するにはどうすればよいでしょうか? これを試して:

[Export]
public class PluginService
{
   public const string BEST_PLUGIN = "BestPlugin";

   [ImportMany]
   public IEnumerable<Plugin> Plugins{ private get; set; }

   [Export(BEST_PLUGIN)]
   public Plugin BestPlugin{ get { return GetBestPlugin(); } }

   Plugin GetBestPlugin()
   {
       return Plugins.FirstOrDefault(); //or some other logic for selection
   }
}

プラグインがリソースを集中的に使用する場合は、遅延初期化を検討することをお勧めします。

Lazy<T, TMetadata>エクスポートへの間接参照を保持するために MEF によって提供される型です。ここでは、エクスポートされたオブジェクト自体に加えて、エクスポート メタデータ、またはエクスポートされたオブジェクトを説明する情報も取得します。それぞれには 、実際の操作を表す オブジェクトと、そのメタデータを表すオブジェクトLazy<T, TMetadata>が含まれています。IOperationIOperationData

http://msdn.microsoft.com/en-us/library/dd460648.aspx#further_imports_and_importmany

MEF には、コンポーネントのカーディナリティ (物の数) に関する強力なルールがあり、予期せぬ事態が発生しないようにしていますが、これは展開に注意する必要があることを意味します。

于 2013-10-09T12:13:47.843 に答える