2012-07-14 14 views
3

我是MEF的新手,並正在嘗試使用ExportFactory。我可以使用ExportFactory根據用戶插入對象創建一個列表嗎?示例將與以下所示內容類似。我可能不理解使用ExportFactory,因爲在運行期間,我在組合過程中遇到下面顯示的錯誤。你好如何使用ExportFactory <T>

1)沒有有效的出口找到匹配的約束 「((exportDefinition.ContractName == 「System.ComponentModel.Composition.ExportFactory(CommonLibrary.IFoo)」) AndAlso(exportDefinition.Metadata.ContainsKey即(「ExportTypeIdentity」) AndAlso 「System.ComponentModel.Composition.ExportFactory(CommonLibrary.IFoo)」。Equals(exportDefinition.Metadata.get_Item(「ExportTypeIdentity」))))', 無效導出可能已被拒絕。

class Program 
{ 
    static void Main(string[] args) 
    { 
     Test mytest = new Test(); 
    } 
} 

public class Test : IPartImportsSatisfiedNotification 
{ 
    [Import] 
    private ExportFactory<IFoo> FooFactory { get; set; } 

    public Test() 
    { 
     CompositionInitializer.SatisfyImports(this); 
     CreateComponent("Amp"); 
     CreateComponent("Passive"); 
    } 

    public void OnImportsSatisfied() 
    { 
     int i = 0; 
    } 

    public void CreateComponent(string name) 
    { 
     var componentExport = FooFactory.CreateExport(); 
     var comp = componentExport.Value; 
    } 
} 

public interface IFoo 
{ 
    double Name { get; set; } 
} 

[ExportMetadata("CompType", "Foo1")] 
[Export(typeof(IFoo))] 
[PartCreationPolicy(System.ComponentModel.Composition.CreationPolicy.NonShared)] 
public class Foo1 : IFoo 
{ 
    public double Name { get; set; } 
    public Foo1() 
    { 

    } 
} 

[ExportMetadata("CompType", "Foo2")] 
[Export(typeof(IFoo))] 
[PartCreationPolicy(System.ComponentModel.Composition.CreationPolicy.NonShared)] 
public class Foo2 : IFoo 
{ 
    public double Name { get; set; } 
    public Foo2() 
    { 
    } 
} 
+0

您實際上並未在您的測試中顯示導入c因此很難說出他們有什麼問題。請編輯你的問題。 – 2012-07-15 05:21:02

+0

我剛剛編輯以前的源,現在顯示導入 – user1522446 2012-07-17 13:21:54

回答

9

這個問題似乎是,你希望導入單個ExportFactory<IFoo>,但您導出兩個不同的IFoo實現。在你的例子中,MEF將無法在兩種實現之間做出決定。

你可能想導入多個工廠,包括元數據是這樣的:

[ImportMany] 
private IEnumerable<ExportFactory<IFoo,IFooMeta>> FooFactories 
{ 
    get; 
    set; 
} 

其中IFooMeta會聲明如下:

public interface IFooMeta 
{ 
    string CompType { get; } 
} 

,然後你可以實現CreateComponent這樣的:

public IFoo CreateComponent(string name, string compType) 
{ 
    var matchingFactory = FooFactories.FirstOrDefault(
     x => x.Metadata.CompType == compType); 
    if (matchingFactory == null) 
    { 
     throw new ArgumentException(
      string.Format("'{0}' is not a known compType", compType), 
      "compType"); 
    } 
    else 
    { 
     IFoo foo = matchingFactory.CreateExport().Value; 
     foo.Name = name; 
     return foo; 
    } 
} 
+0

我仍然有使用ExportFactory的問題。我是否需要將[導入]更改爲[ImportMany]?使用[導入]創建容器時出現錯誤。當我將其更改爲[ImportMany]時,容器已構建,但現在CreateComponent方法表示沒有「Foo1」。 – user1522446 2012-07-19 03:26:10

+0

Wim,感謝您的幫助!我解決了我的問題。 – user1522446 2012-07-19 03:52:39

+0

我的確打算寫'[ImportMany]',現在已經修好了。 – 2012-07-19 21:40:39