4

我正在使用 .NET 4.0 beta 2 中的新System.ComponentModel.Composition命名空间,也称为Managed Extensibility Framework

我使用以下 C# 示例,其中 aMonkey导入 a 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 中,但上述方法不应该也可以吗?

4

1 回答 1

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 需要对容器的引用的原因是目录中可能存在具有导入需要由容器所连接的其他导出提供程序来满足的部分。

于 2009-12-17T21:53:12.303 回答