不能让自定义配置部分工作

本文关键字:工作 配置部 自定义 不能 | 更新日期: 2023-09-27 18:12:57

我试图创建一个自定义配置,看起来像这样。

<configuration>
  <configSections>
    <section name="actions" type="ConfigurationTest.ActionsConfig, UnitTestExperiments" />
    <section name="action" type="ConfigurationTest.ActionConfig, UnitTestExperiments"/>
  </configSections>
  <actions poolSize="100">
    <action name="a1" impl="some.class1">
      <add name="key11" value="value11"/>
      <add name="key12" value="key12"/>
    </action>
    <action name="a2" impl="some.class2">
      <add name="key21" value="value21"/>
      <add name="key22" value="key22"/>
    </action>
  </actions>
</configuration>

这里<action>标记可以出现N次,每个动作都有一组唯一的键。我尝试了几个不同的解决方案和选项,但似乎我不能得到类结构/映射正确。我希望得到一个可以这样调用的结构。

    using System;
    using System.Configuration;
    namespace ConfigurationTest
    {
        public class ActionsConfig : ConfigurationSection
        {
            [ConfigurationProperty("poolSize")]
            public string PoolSize
            {
                get { return (string)this["poolSize"]; }
            }
            [ConfigurationProperty("", IsRequired = true, IsDefaultCollection = true)]
            public ActionList Instances
            {
                get { return (ActionList)this[""]; }
                set { this[""] = value; }
            }
        }
        public class ActionList : ConfigurationElementCollection
        {
            protected override ConfigurationElement CreateNewElement()
            {
                return new ActionConfig();
            }
            protected override object GetElementKey(ConfigurationElement element)
            {
                return ((ActionConfig)element).Name;
            }
        }
        public class ActionConfig : ConfigurationSection
        {
            [ConfigurationProperty("name")]
            public string Name
            {
                get { return (string)this["name"]; }
            }
            [ConfigurationProperty("impl")]
            public string Impl
            {
                get { return (string)this["impl"]; }
            }
            [ConfigurationProperty("", IsDefaultCollection = true)]
            public NameValueConfigurationCollection Settings
            {
                get
                {
                    return (NameValueConfigurationCollection)base[""];
                }
            }
        }

   public class Program
        {
            static void Main(string[] args)
            {
                ActionsConfig ac = ConfigurationManager.GetSection("actions") as ActionsConfig;
                Console.WriteLine(ac.PoolSize);
                ActionConfig nameValueSection = ac.CurrentConfiguration.GetSection("action") as ActionConfig;
                NameValueConfigurationCollection settings = nameValueSection.Settings;
                foreach (var key in settings.AllKeys)
                {
                    Console.WriteLine(settings[key].Name + ": " + settings[key].Value);
                }
            }
        }
    }

异常跟踪如下。

    System.Configuration.ConfigurationErrorsException was unhandled
  Message=Unrecognized element 'action'. (UnitTestExperiments.vshost.exe.Config line 8)
  Source=System.Configuration
  BareMessage=Unrecognized element 'action'.
  Filename=UnitTestExperiments.vshost.exe.Config
  Line=8
  StackTrace:
       at System.Configuration.BaseConfigurationRecord.EvaluateOne(String[] keys, SectionInput input, Boolean isTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult)
       at System.Configuration.BaseConfigurationRecord.Evaluate(FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult, Boolean getLkg, Boolean getRuntimeObject, Object& result, Object& resultRuntimeObject)
       at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
       at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
       at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
       at System.Configuration.BaseConfigurationRecord.GetSection(String configKey)
       at System.Configuration.ConfigurationManager.GetSection(String sectionName)
       at ConfigurationTest.Program.Main(String[] args) in C:'Users'me'Documents'Visual Studio 2010'Projects'UnitTestExperiments'Program.cs:line 63
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

不能让自定义配置部分工作

看一下使用自定义配置设置。这是一个很好的例子。

自定义ADD节查看。net 2.0 .config文件中的自定义ConfigurationSections示例

我从演示项目中得到了确切的答案。

我不得不将代码扩展到一个额外的层,以使它为我工作。