不能让自定义配置部分工作
本文关键字:工作 配置部 自定义 不能 | 更新日期: 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示例
我从演示项目中得到了确切的答案。
我不得不将代码扩展到一个额外的层,以使它为我工作。