【问题标题】:MEF exception " 'SourceProvider' must be set."MEF 异常“必须设置‘SourceProvider’。”
【发布时间】:2010-12-27 17:57:26
【问题描述】:

我正在使用 .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 中,但上述方法不应该也可以吗?

【问题讨论】:

    标签: .net mef .net-4.0-beta-2


    【解决方案1】:

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

    【讨论】:

    • 我通过使用反射器检查 System.Component.Composition.dll 得出了相同的结论。至于手动创建 ExportProviders 的原因,如果您想构建一个可以回退到默认值而不抱怨多个匹配导出的容器,这是必要的。
    猜你喜欢
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多