• .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();
    
            }
    
        }
  • 相关阅读:
    sql声明变量,及if -else语句、while语句的用法
    视图、事务
    索引
    相关子查询
    递归实现treeView下的省市联动
    创建sqlhelp类以封装对数据库的操作及对可空类型的操作
    ADO.Net操作数据库
    sql的case语句
    vue父组件异步数据子组件接收遇到的坑
    第一次用angularJS做后台管理点滴
  • 原文地址:https://www.cnblogs.com/amylis_chen/p/6000628.html
Copyright © 2020-2023  润新知