从 MEF 插件中读取 AppSettings

Posted

技术标签:

【中文标题】从 MEF 插件中读取 AppSettings【英文标题】:Read AppSettings from MEF plugin 【发布时间】:2012-10-09 00:06:00 【问题描述】:

我想从拥有自己的 app.config 文件的 MEF 插件访问 ConfigurationManager.AppSettings 对象中的值。

但是,加载插件后,app.config 文件中的密钥不会出现在 AppSettings 中。 加载插件的应用程序的密钥仍然存在。

我注意到使用Settings.settings 文件允许这种行为,通过app.config 文件,所以文件必须以某种方式加载。

我的插件看起来像:

[Export(IPlugin)]
public class Plugin

    public Plugin()
    
        // reads successfully from app.config via Settings object
        var value1 = Settings.Default["Key1"];

        // returns null from app.config via ConfigurationManager
        var value1 = ConfigurationManager.AppSettings["Key2"]
    

app.config 看起来像这样:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="..." >
      <section name="Plugin.Settings" type="..." />
    </sectionGroup>
  </configSections>

  <appSettings>
    <add key="Key2" value="Fails" />
  </appSettings>

  <applicationSettings>
    <Plugin.Settings>
      <setting name="Key1" serializeAs="String">
        <value>Works</value>
      </setting>
    </Plugin.Settings>
  </applicationSettings>
</configuration>

我可以手动加载app.config 文件:

var config = ConfigurationManager.OpenExeConfiguration("Plugin.dll");
var value = AppSettings.Settings["Key2"].Value

但这似乎更像是一种解决方法而不是解决方案。

有没有办法从插件内部直接访问 MEF 插件的&lt;appSettings&gt;? 如果没有,推荐什么?

【问题讨论】:

【参考方案1】:

默认情况下,ConfigurationManager 会加载入口程序集的 .config,即启动当前执行进程的程序集。

正确的做法是这样的:

[Export(IPlugin)]
public class Plugin

    public Plugin()
    
        var config = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
        var value = config.AppSettings.Settings["Key2"].Value;
    

这将使插件自动打开它所编译的 DLL 的 .config,并从那里获取值。

【讨论】:

我明白了。当我打电话给Settings.Default 时,这可能是“幕后”发生的事情吗? 也许吧。我不确定,但 Reflector 肯定可以对此有所了解。 没有从 Reflector 学到太多东西,它变得相当复杂......但是 GetExecutingAssembly() 调用比硬编码 DLL 名称更可取。看来我会采用这种技术。 我同意。我认为这也比依赖自动生成的 Settings.settings 好得多。【参考方案2】:

我建议您使用像 Unity 这样的依赖注入工具,以便为您的插件提供所需的配置。通过这种方式,您的插件将不再需要引用 System.Configuration.dll。

【讨论】:

很遗憾,我们不能将 Unity 用于当前的项目,但它看起来确实可以用于未来的项目。

以上是关于从 MEF 插件中读取 AppSettings的主要内容,如果未能解决你的问题,请参考以下文章

MEF递归插件搜索

.Net插件编程模型:MEF和MAF

基于 MVC4 MEF 的动态加载插件

MEF插件架构上的“即发即弃”方法

C#]插件编程框架 MAF 开发总结

在.NET Core中使用MEF