首頁  >  文章  >  後端開發  >  .Net 設定檔-繼承ConfigurationSection實作自訂處理類別處理自訂設定節點

.Net 設定檔-繼承ConfigurationSection實作自訂處理類別處理自訂設定節點

黄舟
黄舟原創
2017-02-24 10:29:524478瀏覽

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

 以上就是.Net 設定檔-繼承ConfigurationSection實作自訂處理類別處理自訂設定節點 的內容,更多相關內容請關注PHP中文網(www.php.cn )!





#
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn