2

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

所以像这样

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 导入非单例,但这可能会破坏我的导入。

4

1 回答 1

3

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

你可以这样做:

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

这将导出 ClassA 的所有派生类(以及具有 ClassB 合同而不具有 ClassA 的 ClassB)和单独的 ClassA。此外,如果您想隐藏基础部分但仍想在此类中使用导入,您可以将该[PartNotDiscoverable]属性添加到您的基础类中。

于 2013-06-21T13:06:47.627 回答