如何将满足导入的类的实例添加到CompositionContainer

时间:2014-03-19 20:14:10

标签: mef

我遇到以下问题:

var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(typeof(Type1).Assembly));
catalog.Catalogs.Add(new AssemblyCatalog(typeof(Type2).Assembly));

using (CompositionContainer container = new CompositionContainer(catalog))
{
}

我需要再出口一次:

Export[(typeof(Type3))]

问题是我不能包含具有此Export属性的类的程序集。我想告诉容器:

var myObject = new Type4();
每次需要Import [(typeof(Type3))]时,都应导出

myObject(Type4的实例)。此外,我无法使用Export [(typeof(Type3))]标记Type4,而且我希望MEF使用该类的实例(因此使用Export属性标记此类并不起作用,因为我在我将它传递给MEF之前更改myObject,我希望它用于满足Import。。

然后当我尝试做的时候:

container.SatisfyImportsOnce(importer);

我希望MEF将从目录中的程序集中获取所有对象,对于缺少的Type3,它将使用myObject。这应该是我做的时候的价值:

container.GetExportedValue<Type3>();

我花了一天时间尝试不同的方法:自定义ExporterProvider和Type4的某种继承,用适当的Export属性标记它,但我无法按照我的意愿使用它。

我非常感谢您的帮助。

谢谢!

1 个答案:

答案 0 :(得分:2)

好的,已经找到了答案。

  1. 第一个问题是我向AggregateCatalog添加了2个相同的AssemblyCatalog - 不要这样做。

  2. 解决方案是使用CompositionBatch:

    var catalog = new AggregateCatalog();
    catalog.Catalogs.Add(new AssemblyCatalog(typeof(Type1).Assembly));
    catalog.Catalogs.Add(new AssemblyCatalog(typeof(Type2).Assembly));
    var myObject = new Type4();
    
    using (CompositionContainer container = new CompositionContainer(catalog))
    {
      var batch = new CompositionBatch();
      Export ex = CreateExport<Type3>(myObject);  //Custom implementation
      batch.AddExport(ex);      
      container.Compose(batch);
      var val = container.GetExportedValue<Type3>();  //value == myObject
    }
    
  3. 谢谢!