【问题标题】:MEF Export derived classes ans new instancesMEF 导出派生类和新实例
【发布时间】:2013-06-21 21:12:39
【问题描述】:

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

就这样

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

【问题讨论】:

  • 您收到的错误信息是什么?请注意,RegistrationBuilder.ForTypesDerivedFrom 将不包含指定类型,仅包含其派生类。

标签: mef


【解决方案1】:

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

你可以这样做:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 2013-02-12
    • 2023-03-04
    相关资源
    最近更新 更多