【问题标题】:How can i load just specific Plugins by MEF?如何通过 MEF 仅加载特定插件?
【发布时间】:2017-11-07 03:25:36
【问题描述】:

对于我的公司,我正在开发一个可以普遍使用的简单 GUI 框架。我希望 GUI 框架在启动时读取一个配置文件,该文件定义了应该加载哪些插件,应该在哪里安排它们的 GUI 元素等等。但是配置文件的读取以及一些写入应该通过插件进行。所以这就是为什么,这个插件应该先加载,因为在加载其他插件之前,它需要读取配置文件来识别它们。

我发现,我可以像这样加载一个已定义的 dll: var dirCatalog = new DirectoryCatalog(@"..\..\Extensions\","ProgramConfigManager*");

但我不想依赖文件名。我的意图是首先使用接口ISAProgramConfigManagerContent 加载MEF 插件:

[Import(typeof(ISAProgramConfigManagerContent))]
SAProgramConfigManagerContent PCM;

在此之后,其他插件,但只是配置文件中的插件应该被加载到这个:

[ImportMany(typeof(IPlugin))]
List<IPlugin> Plugins;

有没有办法,首先通过过滤合约加载处理配置文件的特殊插件,然后编写ISAProgramConfigManagerContent 类型的插件?

提前致谢。

【问题讨论】:

    标签: c# .net mef


    【解决方案1】:

    从其他程序集导入时,您必须告诉 MEF 查看哪些文件。这可以是一个目录,通过文件通配或任何其他自定义方式。否则 MEF 无法在哪里寻找导出。

    话虽如此,您可以先设置一个目录来加载插件管理器。然后,基于此,设置另一个目录,其中包含您要加载的条目并从中以编程方式导入插件。您也可以使用AggregateCatalog 来联合多个DirectoryCatalogs。

    类似:

    var container = new CompositionContainer(aggregateCatalog);
    IEnumerable<IPlugin> plugins = container.GetExports<IPlugin>();
    

    【讨论】:

    • 通过“管理器插件”的路径或名称来区分就是这样,我不想去。但是 GetExport 正是我正在寻找的东西:Lazy&lt;ISAProgramConfigManagerContent&gt; p = ExtensionCandidates.GetExport&lt;ISAProgramConfigManagerContent&gt;(); 所以我得到了正确类型的插件。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多