在开发中,相信大家经常都要和配置文件打交道,不管是应用程序的App.config文件,或者是Web程序的Web.config文件。今天闲来无事,突然想到一直只是在用*.config文件进行配置参数,却从未做过自定义配置节点的开发,稍微研究了一下,写下此文记录学习心得。
先介绍一下本文中涉及到的配置文件分别为 App.config 和 Collector.config。
App.config
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <configSections> 4 <sectionGroup name="collector" type="Labs.CollectorSectionGroup, Labs"> 5 <section name="backup" type="Labs.BackupSection, Labs"/> 6 </sectionGroup> 7 </configSections> 8 <startup> 9 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 10 </startup> 11 <collector> 12 <backup configSource="Collector.config" /> 13 </collector> 14 </configuration>
Collector.config
1 <?xml version="1.0" encoding="utf-8" ?> 2 <backup path="D:\Downloads"> 3 <triggedTimes> 4 <add time="10:00:00" /> 5 <add time="12:00:00" /> 6 </triggedTimes> 7 </backup>
把 Collector.config 的配置节点从 App.config 中分离出来,主要是为了演示 configSource 的使用。 configSource 只在自定义的 section 节点中可用。
开发自定义配置节点主要涉及到如下几个类:
CollectorSectionGroup 继承自 ConfigurationSectionGroup 对应的节点为 <sectionGroup name="collector" type="Labs.CollectorSectionGroup, Labs"> 以及 <collector>,主要用于定义自定义节点集合,代码如下所示:
1 using System.Configuration; 2 3 namespace Labs 4 { 5 public sealed class CollectorSectionGroup : ConfigurationSectionGroup 6 { 7 [ConfigurationProperty("backup", IsRequired = true)] 8 public BackupSection BackupSection 9 { 10 get { return Sections["backup"] as BackupSection; } 11 } 12 } 13 }
BackupSection 继承自 ConfigurationSection 对应的节点为 <section name="backup" type="Labs.BackupSection, Labs"/> 以及 <backup configSource="Collector.config" />,主要用于定义自定义节点。类中定义了一个 Path 属性以及TriggedTimes 元素集合属性,分别对应节点为 <backup path="D:\Downloads"> 和 <triggedTimes>,代码如下所示:
1 using System.Configuration; 2 3 namespace Labs 4 { 5 public sealed class BackupSection : ConfigurationSection 6 { 7 [ConfigurationProperty("path", IsRequired = true)] 8 public string Path 9 { 10 get { return this["path"].ToString(); } 11 internal set { this["path"] = value; } 12 } 13 14 [ConfigurationProperty("triggedTimes", IsRequired = true)] 15 [ConfigurationCollection(typeof(TriggedTime))] 16 public TriggedTimeCollection TriggedTimes 17 { 18 get { return this["triggedTimes"] as TriggedTimeCollection; } 19 internal set { this["triggedTimes"] = value; } 20 } 21 } 22 }
TriggedTimeCollection 继承自 ConfigurationElementCollection 对应的节点为 <triggedTimes>,代码如下所示:
1 using System.Configuration; 2 3 namespace Labs 4 { 5 public sealed class TriggedTimeCollection : ConfigurationElementCollection 6 { 7 protected override ConfigurationElement CreateNewElement() 8 { 9 return new TriggedTime(); 10 } 11 12 protected override object GetElementKey(ConfigurationElement element) 13 { 14 return element.GetHashCode(); 15 } 16 } 17 }
TriggedTime 继承自 ConfigurationElement 对应节点为 <add time="10:00:00" />,代码如下所示:
1 using System; 2 using System.Configuration; 3 4 namespace Labs 5 { 6 public sealed class TriggedTime : ConfigurationElement 7 { 8 [ConfigurationProperty("time", IsRequired = true)] 9 public TimeSpan Time 10 { 11 get { return (TimeSpan)this["time"]; } 12 internal set { this["time"] = value; } 13 } 14 } 15 }
演示代码主要演示了显示 <collector> 节点下的配置信息及更新 <backup path="D:\Downloads"> 中的 path 值,代码如下所示:
1 using System; 2 using System.Configuration; 3 4 namespace Labs 5 { 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 DisplayConfigurations(); 11 var configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 12 var sectionGroup = configuration.GetSectionGroup("collector") as CollectorSectionGroup; 13 if (sectionGroup != null) 14 { 15 sectionGroup.BackupSection.Path = @"D:\Test"; 16 } 17 configuration.Save(ConfigurationSaveMode.Full); 18 DisplayConfigurations(); 19 } 20 21 /// <summary> 22 /// 显示配置信息。 23 /// </summary> 24 static void DisplayConfigurations() 25 { 26 var configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 27 var sectionGroup = (CollectorSectionGroup)configuration.GetSectionGroup("collector"); 28 29 if (sectionGroup != null) { 30 Console.WriteLine(sectionGroup.BackupSection.Path); 31 foreach (TriggedTime triggedTime in sectionGroup.BackupSection.TriggedTimes) 32 { 33 Console.WriteLine("Trigged time: {0}", triggedTime.Time); 34 } 35 } 36 } 37 } 38 }
如果需要对 Web 应用程序的 Web.config 配置信息进行修改,与 App.cnfig 不同的是,需要使用 WebConfigurationManager 类而不是 ConfigurationManager 类,代码如下所示:
1 var configuration = WebConfigurationManager.OpenWebConfiguration("~"); 2 var settings = configuration.AppSettings.Settings; 3 settings.Remove("title"); 4 settings.Add("title", model.Title); 5 configuration.Save();
文中涉及代码可点击此处进行下载。