我遇到以下问题:
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属性标记它,但我无法按照我的意愿使用它。
我非常感谢您的帮助。
谢谢!
答案 0 :(得分:2)
好的,已经找到了答案。
第一个问题是我向AggregateCatalog添加了2个相同的AssemblyCatalog - 不要这样做。
解决方案是使用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
}
谢谢!