代码之家  ›  专栏  ›  技术社区  ›  Wim Coenen

MEF异常“必须设置“SourceProvider”

  •  4
  • Wim Coenen  · 技术社区  · 14 年前

    我在玩弄新玩具 System.ComponentModel.Composition Managed Extensibility Framework .

    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中,但上面的操作是否也可以?

    1 回复  |  直到 14 年前
        1
  •  5
  •   Daniel Plaisted    14 年前

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

    推荐文章