自定义应用程序配置节点

在开发中,相信大家经常都要和配置文件打交道,不管是应用程序的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();

文中涉及代码可点击此处进行下载。

转载于:https://www.cnblogs.com/alancai/archive/2013/06/04/3117552.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值