我有一个基类和一个派生类,我想导出从其中派生的类型。
所以喜欢这个
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导入非单身,但这可能会破坏我的导入。
答案 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]
属性添加到基类。