zoukankan      html  css  js  c++  java
  • .Net 配置文件——继承ConfigurationSection实现自己定义处理类处理自己定义配置节点


            除了使用继承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下结果。

    。。。







  • 相关阅读:
    POJ 1300 Open Door
    POJ 2230 Watchcow
    codevs 1028 花店橱窗布置
    codevs 1021 玛丽卡
    codevs 1519 过路费
    codevs 3287 货车运输
    codevs 3305 水果姐逛水果街二
    codevs 1036 商务旅行
    codevs 4605 LCA
    POJ 1330 Nearest Common Ancestors
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5138820.html
Copyright © 2011-2022 走看看