从 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 插件的<appSettings>
?
如果没有,推荐什么?
【问题讨论】:
【参考方案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的主要内容,如果未能解决你的问题,请参考以下文章