2009-12-17 43 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

相关问题