MEF导出派生类和新实例

时间:2013-06-13 10:16:12

标签: mef

我有一个基类和一个派生类,我想导出从其中派生的类型。

所以喜欢这个

public class ClassA { }
public class ClassB : ClassA { }

我需要加载从ClassA派生的类型,以及从ClassB派生的类型。

var registration = new RegistrationBuilder();

registration.ForTypesDerivedFrom<ClassA>()
    .Export<ClassA>();

registration.ForTypesDerivedFrom<ClassB>()
    .Export<ClassB>();

var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new DirectoryCatalog(".", registration));
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly(), registration));

container = new CompositionContainer(catalog);
container.SatisfyImportsOnce(this, registration);

我认为问题在于,在导出ClassA派生类型时,它还会导出ClassB类型,这很明显,并且是我正在寻找的功能。但这意味着ClassB导入不会导出为独立对象,而是与导入为ClassA类型的导入相同。如果我没有专门导出ClassB,那么使用它们的任何导入都会失败。

我可能会尝试做一些愚蠢的尝试,在这里解决我的问题,MEF不喜欢?我已经考虑过让MEF导入非单身,但这可能会破坏我的导入。

1 个答案:

答案 0 :(得分:3)

在给定的示例中,只将ClassB(具有classA的导出定义)导出为MEF部分。正如Panos已经提到的,ForTypesDerivedFrom不会导出基类。

您可以这样做:

var registration = new RegistrationBuilder();
registration.ForTypesDerivedFrom<ClassA>().Export();
registration.ForType<ClassA>().Export();

这将导出ClassA的所有派生类(也是带有ClassB契约的ClassB而不是ClassA)和单独的ClassA。 此外,如果要隐藏基础部分但仍希望在此类中使用导入,则可以将[PartNotDiscoverable]属性添加到基类。