无法让自定义配置部分工作

问题描述:

我正在尝试创建一个如下所示的自定义配置。无法让自定义配置部分工作

<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: 
+0

究竟你有什么问题?是否有例外?你能显示配置部分的定义吗? –

+0

更新了内容 –

+0

您是否找到解决此问题的方法? – Dorin

我从示范项目确切的答案Here

我不得不代码扩展到一个额外层让它为我工作。

看看使用Custom Configuration Settings。这有一个很好的例子。

更新

添加自定义的部分看看例子Custom ConfigurationSections in .NET 2.0 .config Files

+0

我期待获得一个类结构,它允许我像键值对那样访问''属性。 –

+0

我想使用''属性,如键值对,它的工作原理。我无法将Actions标签绑定到N个Action标签,然后像keyvalue对那样访问属性 –