我正在使用.NET 4.0 beta 2中的新System.ComponentModel.Composition命名空间,也称为Managed Extensibility Framework。
我使用以下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中,但是上面也不应该有效吗?
答案 0 :(得分: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需要对容器的引用的原因是目录中可能存在导入需要由容器连接到的其他导出提供程序满足的部分。