Укажите конфигурацию плагина в основном app.config - PullRequest
0 голосов
/ 07 апреля 2011

У меня есть базовая система плагинов, где dll плагина указаны в app.config основного exe.Я хочу добавить конфигурацию плагина в основной файл 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 голосов
/ 07 апреля 2011

Вы можете сделать это, используя 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;
        }
    }
...