.net “MEF例外情况”';SourceProvider';必须设置;
我正在使用.NET4.0Beta2中的新名称空间,也称为 我使用下面的C#示例,其中.net “MEF例外情况”';SourceProvider';必须设置;,.net,mef,.net-4.0-beta-2,.net,Mef,.net 4.0 Beta 2,我正在使用.NET4.0Beta2中的新名称空间,也称为 我使用下面的C#示例,其中猴子导入香蕉: public interface IBanana { } [Export(typeof(IBanana))] public class Banana : IBanana { } public class Monkey { [Import(typeof(IBanana))] public IBanana Banana { get; set; } } 但是,当我尝试按如
猴子
导入香蕉
:
public interface IBanana
{
}
[Export(typeof(IBanana))]
public class Banana : IBanana
{
}
public class Monkey
{
[Import(typeof(IBanana))]
public IBanana Banana { get; set; }
}
但是,当我尝试按如下方式组合monkey时,我会得到一个InvalidOperationException
,消息是“此对象尚未初始化-必须设置属性“SourceProvider”。”:
我错过了什么?我知道我可以直接传递目录,而无需将其包装在CatalogExportProvider中,但上述操作是否也应该起作用?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需要引用容器的原因是,目录中可能有包含导入的部分需要由容器连接到的其他导出提供程序来满足。我通过使用reflector检查System.Component.Composition.dll得出了相同的结论。至于手动创建ExportProviders的原因,如果您想要构建一个可以依赖默认值而不抱怨多个匹配导出的容器,那么这是必要的。
var exportProvider = new CatalogExportProvider(new TypeCatalog(typeof(Banana)));
var container = new CompositionContainer(exportProvider);
exportProvider.SourceProvider = container;
var monkey = new Monkey();
container.ComposeParts(monkey);