2011-02-23 38 views
4

我使用MEF下面的示例代碼:MEF通用進口

public interface IFoo<T> 
{} 

public class Foo<T> : IFoo<T> 
{} 

[Export(typeof(IFoo<String>))] 
public class Foo : Foo<String> 
{} 

public class Bar<T> 
{ 
    [Import] 
    private readonly IFoo<T> foo; 
} 

static void Main() 
{ 
    var catalog = new AggregateCatalog(); 
    catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly())); 
    var container = new CompositionContainer(catalog); 
    container.ComposeParts(); 

    var bar = new Bar<String>(); 
    //bar.foo would be null 
} 

這似乎並沒有工作 - foonull。這是因爲它的類型不被MEF看作IFoo<String>

+0

在你的Foo類的聲明中,你有'Foo :IFoo '。這聲明瞭一個名爲'String'的泛型類型,它不使用實際的字符串類。你有什麼相當於'Foo :IFoo '。如果你想讓Foo不是泛型的,那麼永遠是一個'IFoo ',你需要做'Foo:IFoo '。如果您希望Foo類是通用類型的,我會將您的泛型類型重命名爲'',以減少混淆。 – 2011-02-23 15:02:57

+0

感謝您發現錯誤 - 我過度壓縮了這個問題,並錯過了一個額外的聲明。我已經重新編輯了,現在Foo 實現了IFoo ,並且Foo實現了繼承Foo (並導出IFoo )。 – 2011-02-26 09:31:44

回答

8

foo爲空是因爲您正在自己創建實例。您需要讓容器創建實例。

此外,如果您計劃導入/導出泛型,您將希望查看GenericCatalog

+0

謝謝湯姆 - 我意識到我沒有組成酒吧 - 但因爲認爲這是一個通用問題而不是我的編碼錯誤而變得盲目。 – 2011-02-23 14:13:22