在主app.config中指定插件的配置

时间:2011-04-07 10:41:52

标签: .net plugins configuration app-config

我有一个基本的插件系统,其中插件dll在主exe的app.config中指定。我想将插件配置添加到主app.config中,如下所示:

<plugins>
  <processorPlugins>
    <plugin type="PluginType1, PluginAssembly1" />
    <plugin type="PluginType2, PluginAssembly2">
      <pluginConfig1 attr="..." />
      <pluginConfig2>
        <pluginOption1 />
        <pluginOption2 />
        <pluginOption3 />
        ...
    </plugin>
  </processorPlugins>
</plugins>

我无法弄清楚如何让它与app.config顶部指定的自定义配置部分很好地配合。

是否有某种加载插件的方法,将插件dll中的自定义部分类型添加到ConfigurationManager或configSections,然后使用这些类型重新解释插件选项?或者另一种方式呢?

1 个答案:

答案 0 :(得分:0)

您可以使用ConfigurationSections执行此操作,但是您需要在插件本身的插件本身之外的插件中配置插件。

例如

<configuration>
    <configSections>
        <sectionGroup name="PluginConfigs">
            <section name="PluginConfigs.MyPlugin" type="Plugins.MyPlugin.Config.RootConfigSection, Plugins" />
        </sectionGroup>
    </configSections>

    .......
<plugins>
    <processorPlugins>
        <plugin Type="MyPlugin, Plugins" Config="Plugins.MyPlugin" />
    </processorPlugins>
<plugins> 


<PluginConfigs>

    <PluginConfigs.MyPlugin SomeConfigValue="">        
    </PluginConfigs.MyPlugin>
</PluginConfigs>

然后在你的代码中获得配置部分..

 public sealed class RootConfigSection : ConfigurationSection
{
    private static volatile RootConfigSection instance;
    private static volatile object syncRoot = new object();

    public static RootConfigSection Instance
    {
        get
        {
            if (instance == null)
            {
                lock (syncRoot)
                {
                    if (instance == null)
                    {
                        instance = ConfigurationManager.GetSection("PluginConfigs/PluginConfigs.MyPlugin") as RootConfigSection;
                        if (instance == null)
                        {
                            throw new ConfigurationErrorsException("You must add the PluginConfigs/PluginConfigs.MyPlugin' section to your configuration file");
                        }
                    }
                }
            }
            return instance;
        }
    }