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下结果。

    。。。







  • 相关阅读:
    为什么接口类型可以直接new?
    Eclipse查看JDK源码
    模板模式与策略模式/template模式与strategy模式/行为型模式
    [LeetCode] 105. Construct Binary Tree from Preorder and Inorder Traversal(根据二叉树的前序和中序遍历构建二叉树)
    [LeetCode] 114. Flattern Binary Tree to Linked List(将二叉树扁平化成单链表)
    [LeetCode] 208. Implement Trie (Prefix Tree)(实现字典树)
    [LeetCode] 337. House Robber Ⅲ(偷家贼之三)
    [LeetCode] 621. Task Scheduler(任务调度器)
    [LeetCode] 394. Decode String(解码字符串)
    [LeetCode] 11. Container with Most Water(盛水量最多的容器)
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5138820.html
Copyright © 2011-2022 走看看