.Net 配置文件——继承ConfigurationSection实现自定义处理类处理自定义配置节点

时间:2021-02-06 08:50:55


        除了使用继承IConfigurationSectionHandler的方法定义处理自定义节点的类,还可以通过继承ConfigurationSection类实现同样效果。


            首先说下.Net配置文件中一个潜规则:

         在配置节点时,对于想要进行存储的参数数据,可以采用两种方式:一种是存储到节点的属性中,另一种是存储在节点的文本中。

        因为一个节点可以有很多属性,但是只要一个innertext,而要在程序中将这两种形式区分开会带来复杂性。 为了避免这个问题,.net的配置文件只是用属性存储而不使用innertext.


      接着,我们来写一个符合这个潜规则的自定义配置文件,方便测试:

      

<mailServerGroup provider="www.baidu.com">    <mailServers>
<mailServer client="http://blog.csdn.net/lhc1105" address="13232@qq.com" userName="lhc" password="2343254"/>
<mailServer client="http://blog345.csdn.net/lhc1105" address="132wdfgdsggtaewg32@qq.com" userName="dfshs水田如雅" password="2334t243的萨芬234254"/>
<mailServer client="http://blog436.csdn.net/lhc1105" address="132wdgadsfgdtaewg32@qq.com" userName="sdfhdfs水田如雅" password="23ewrty2343的萨芬234254"/>
<mailServer client="http://blo345734g.csdn.net/lhc1105" address="132wdgdfagdstaewg32@qq.com" userName="sdfher水田如雅" password="23erwt43的萨芬234254"/>
</mailServers>
</mailServerGroup>

      接着,我们来写相应的处理类,这里我们由内向外来写:


      首先是最内层的mailServer:


      

 /// <summary>    /// Class MailServerElement:用于映射mailServer节点,这里是实际存储数据的地方;    /// </summary>    /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 21:51:57</remarks>    public sealed class MailServerElement : ConfigurationElement  //配置文件中的配置元素    {        /// <summary>        /// Gets or sets the client.        /// </summary>        /// <value>The client.</value>        /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:40</remarks>        [ConfigurationProperty("client", IsKey = true, IsRequired = true)]  //client是必须的key属性,有点儿主键的意思,例如,如果定义多个client相同的节点,循环读取的话就只读取到最后一个值        public string Client        {            get            {                return this["client"] as string;            }            set            {                this["client"] = value;            }        }        /// <summary>        /// Gets or sets the address.        /// </summary>        /// <value>The address.</value>        /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:38</remarks>        [ConfigurationProperty("address")]        public string Address        {            get            {                return this["address"] as string;            }            set            {                this["address"] = value;            }        }        /// <summary>        /// Gets or sets the name of the user.        /// </summary>        /// <value>The name of the user.</value>        /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:35</remarks>        [ConfigurationProperty("userName")]        public string UserName        {            get            {                return this["userName"] as string;            }            set            {                this["userName"] = value;            }        }        /// <summary>        /// Gets or sets the password.        /// </summary>        /// <value>The password.</value>        /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:33</remarks>        [ConfigurationProperty("password")]        public string Password        {            get            {                return this["password"] as string;            }            set            {                this["password"] = value;            }        }    }



      接着是mailServers,它是一个mailServer的集合:


 

 /// <summary>    /// Class MailServerCollection:映射mailServers节点,为一个集合类,另外还包含了很多对节点的操作方法,大部分继承自ConfigurationElementCollection    /// </summary>    /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 21:52:00</remarks>    public sealed class MailServerCollection : ConfigurationElementCollection    {        /// <summary>        /// 获取 <see cref="T:System.Configuration.ConfigurationElementCollection" /> 的类型。        /// </summary>        /// <value>The type of the collection.</value>        /// <returns>此集合的 <see cref="T:System.Configuration.ConfigurationElementCollectionType" />。</returns>        /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:08</remarks>        public override ConfigurationElementCollectionType CollectionType        {            get            {                return ConfigurationElementCollectionType.BasicMap;            }                 }        /// <summary>        /// 当在派生的类中重写时,创建一个新的 <see cref="T:System.Configuration.ConfigurationElement" />。        /// </summary>        /// <returns>新的 <see cref="T:System.Configuration.ConfigurationElement" />。</returns>        /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:03</remarks>        protected override ConfigurationElement CreateNewElement()        {            return new MailServerElement();        }        /// <summary>        /// 在派生类中重写时获取指定配置元素的元素键。        /// </summary>        /// <param name="element">要为其返回键的 <see cref="T:System.Configuration.ConfigurationElement" />。</param>        /// <returns>一个 <see cref="T:System.Object" />,用作指定 <see cref="T:System.Configuration.ConfigurationElement" /> 的键。</returns>        /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:04:51</remarks>        protected override object GetElementKey(ConfigurationElement element)        {            return (element as MailServerElement).Client;        }        /// <summary>        /// 获取在派生的类中重写时用于标识配置文件中此元素集合的名称。        /// </summary>        /// <value>The name of the element.</value>        /// <returns>集合的名称;否则为空字符串。默认值为空字符串。</returns>        /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 23:41:40</remarks>        protected override string ElementName        {            get            {                return "mailServer";            }        }        /// <summary>        /// 获取集合中的元素数。        /// </summary>        /// <value>The count.</value>        /// <returns>集合中的元素数。</returns>        /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:08:24</remarks>        public new int Count        {            get { return base.Count; }        }        /// <summary>        /// 获取或设置此配置元素的属性、特性或子元素。        /// </summary>        /// <param name="index">The index.</param>        /// <returns>MailServerElement.</returns>        /// <remarks>Editor:v-liuhch</remarks>        public MailServerElement this[int index]        {            get { return BaseGet(index) as MailServerElement; }            set            {                if (BaseGet(index) != null)                {                    BaseRemoveAt(index);                }                BaseAdd(index, value);            }        }        /// <summary>        /// 获取或设置此配置元素的属性、特性或子元素。        /// </summary>        /// <param name="Name">The name.</param>        /// <returns>MailServerElement.</returns>        /// <remarks>Editor:v-liuhch</remarks>        new public MailServerElement this[string Name]        {            get { return BaseGet(Name) as MailServerElement; }        }        /// <summary>        /// Indexes the of.        /// </summary>        /// <param name="element">The element.</param>        /// <returns>System.Int32.</returns>        /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:24:16</remarks>        public int IndexOf(MailServerElement element)        {            return BaseIndexOf(element);        }        /// <summary>        /// Adds the specified element.        /// </summary>        /// <param name="element">The element.</param>        /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:26:06</remarks>        public void Add(MailServerElement element)        {            BaseAdd(element);        }        /// <summary>        /// Removes the specified element.        /// </summary>        /// <param name="element">The element.</param>        /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:27:01</remarks>        public void Remove(MailServerElement element)        {            if (BaseIndexOf(element) > 0)            {                BaseRemove(element.Client);            }        }        /// <summary>        /// Removes at.        /// </summary>        /// <param name="index">The index.</param>        /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:33:29</remarks>        public void RemoveAt(int index)        {            BaseRemoveAt(index);        }        /// <summary>        /// Removes the specified client.        /// </summary>        /// <param name="client">The client.</param>        /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:34:04</remarks>        public void Remove(string client)        {            BaseRemove(client);        }        /// <summary>        /// Clears this instance.        /// </summary>        /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:34:29</remarks>        public void Clear()        {            BaseClear();        }    }

    最后是最外层的group:


 /// <summary>    /// Class MailServerSection 为入口:    /// </summary>    /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 21:41:02</remarks>    public class MailServerSection : ConfigurationSection   //继承配置文件中节    {        /// <summary>        /// Gets the provider.:映射mailServerGroup节点的provider        /// </summary>        /// <value>The provider.</value>        /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:59</remarks>        [ConfigurationProperty("provider", IsKey = true)]        public string provider { get { return this["provider"] as string; } }        /// <summary>        /// Gets or sets the mail servers.:映射新添加的节点mailServers节点;这个节点下还包含了若干个mailServer节点,因此它是一个集合类        /// </summary>        /// <value>The mail servers.</value>        /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:56</remarks>        [ConfigurationProperty("mailServers", IsDefaultCollection = false)]        public MailServerCollection MailServers        {            get            {                return this["mailServers"] as MailServerCollection;            }            set            {                this["mailServers"] = value;            }        }    }


同样,关联处理类和节点:


 <section name="mailServerGroup" type="继承ConfigurationSection基类.MailServerSection,继承ConfigurationSection基类"/>     </configSections>


之后做个测试:


class Program    {        static void Main(string[] args)        {            Test();        }        /// <summary>        /// Tests this instance.:读取节点值示例        /// </summary>        /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 23:04:53</remarks>        private static void Test() {            MailServerSection mailSection = (MailServerSection)ConfigurationManager.GetSection("mailServerGroup");            Console.WriteLine("MailServerSection 的provider属性值:"+mailSection.provider);            foreach (MailServerElement config in mailSection.MailServers)            {                Console.WriteLine("----------------------------------");                Console.WriteLine("client值为:"+config.Client);                Console.WriteLine("address值为:"+config.Address);                Console.WriteLine("username值为:"+config.UserName);                Console.WriteLine("password值为:"+config.Password);                Console.WriteLine("----------------------------------");            }            Console.ReadKey();        }    }




      本来还想传张结果图,但是网速慢,算啦,喜欢玩儿的童鞋自己run下结果。。。。。