2009-12-17 74 views
4

我正在玩.NET 4.0 beta 2中的新名稱空間System.ComponentModel.Composition,也稱爲Managed Extensibility Framework必須設置MEF異常「'SourceProvider'」。

我用下面的C#示例,其中Monkey進口了Banana

public interface IBanana 
{ 
} 

[Export(typeof(IBanana))] 
public class Banana : IBanana 
{ 
} 

public class Monkey 
{ 
    [Import(typeof(IBanana))] 
    public IBanana Banana { get; set; } 
} 

然而,當我嘗試撰寫猴子作爲然後跟隨我得到一個InvalidOperationException這個對象一直沒有消息「初始化 - 屬性「SourceProvider」必須設置「:

var exportProvider = new CatalogExportProvider(new TypeCatalog(typeof(Banana))); 
var container = new CompositionContainer(exportProvider); 
var monkey = new Monkey(); 
container.ComposeParts(monkey); 

缺少什麼我在這裏?我知道我可以直接傳遞該目錄而不將其包裝在CatelogExportProvider中,但是不應該也可以工作?

回答

5

CatalogExportProvider需要引用回容器。下面的代碼應工作:當你傳遞一個目錄到構造函數

var exportProvider = new CatalogExportProvider(new TypeCatalog(typeof(Banana))); 
var container = new CompositionContainer(exportProvider); 
exportProvider.SourceProvider = container; 
var monkey = new Monkey(); 
container.ComposeParts(monkey); 

容器自動執行此操作。我不認爲通常需要手動創建CatalogExportProvider。

CatalogExportProvider需要對容器進行引用的原因是,目錄中可能有部分需要由其他導出提供程序滿足的容器所需的導入。

+0

我通過用反射器檢查System.Component.Composition.dll得出了相同的結論。至於要手動創建ExportProviders的原因,如果您希望構建可以回退默認值的容器而不抱怨多個匹配導出,則這是必需的。 – 2009-12-17 22:31:20

相關問題