2013-12-08 5 views
6

私はMEFを使用していると私は同じ契約タイプを有する二つの輸出を持っていますが、別のコントラクト名サービスロケータ:取得し、すべての輸出

例:と:

[Export("TypeA", typeof(MyPlugin))] 
[Export("TypeB", typeof(MyPlugin))] 

私が使用して各輸出を取得することができ

ServiceLocator.GetExportedValues<MyPlugin>("TypeA"); 

これで、MyPluginを実装するすべてのインスタンスを取得したいと考えています。私はそれを行うことができる方法はありますか?私は次のコードを使用してみました

ServiceLocator.GetExportedValues<MyPlugin>(); 

しかし、それは動作しませんでした。明らかに、特定の契約名のない実装のみを取得するために使用されます。

意見はありますか?

答えて

4

からfuther情報を得ることができます。例えば

// named and nameless 
[Export("TypeA", typeof(MyPlugin))] 
[Export(typeof(MyPlugin))] 

// named nameless, again 
[Export("TypeB", typeof(MyPlugin))] 
[Export(typeof(MyPlugin))] 

class MyPlugin { } 


[TestMethod] 
public void mef() 
{ 
    var catalog = new AssemblyCatalog(this.GetType().Assembly); 
    var container = new CompositionContainer(catalog); 

    Assert.AreEqual(2, container.GetExportedValues<MyPlugin>().Count()); 
} 
0

厳密に型指定されたメタデータエクスポートを使用できます。

  1. インターフェイスから実装されているExportAttributeから継承されたカスタム属性を作成します。
  2. エクスポートの代わりにこのカスタム属性を使用します。

インポートを使用して、必要なタイプを取得することができます。

[ImportMany] 
public IEnumerable<Lazy<YourType,IMetadataAttribute>> Plugins{get;private set;} 

あなたはそれが両方の方法で解決したい場合、私は単純にすべての名前の輸出と並んで無名の輸出を追加することになりMEF Documentation

0

Export

[Export(typeof(IFoo)),Export("TypeA", typeof(IFoo))] 
public class Foo1 : IFoo { } 

[Export(typeof(IFoo)),Export("TypeB", typeof(IFoo))] 
public class Foo2 : IFoo { } 

の両方のタイプを宣言し、ImportMany

[ImportMany] 
IFoo[] foos; 
+1

どのようにこの答えはdefault.kramerの@よりも何が違うのですか?使用してそれらをインポート –

+0

宣言は同じですが、Mefにコンテナ/カタログを直接参照せずにすべてのインスタンスを注入させる方法を示しています...どのようにDIフレームワークを使用するのが適切な方法です。 –