Heim  >  Artikel  >  Backend-Entwicklung  >  .Net-Konfigurationsdatei – erbt ConfigurationSection, um benutzerdefinierte Verarbeitungsklassen zur Verarbeitung benutzerdefinierter Konfigurationsknoten zu implementieren

.Net-Konfigurationsdatei – erbt ConfigurationSection, um benutzerdefinierte Verarbeitungsklassen zur Verarbeitung benutzerdefinierter Konfigurationsknoten zu implementieren

黄舟
黄舟Original
2017-02-24 10:29:524473Durchsuche

Zusätzlich zur Verwendung der Methode der Vererbung von IConfigurationSectionHandler zum Definieren einer Klasse für die Verarbeitung benutzerdefinierter Knoten können Sie den gleichen Effekt auch durch die Vererbung der ConfigurationSection-Klasse erzielen.

Lassen Sie uns zunächst über eine unausgesprochene Regel in der .Net-Konfigurationsdatei sprechen

Bei der Konfiguration eines Knotens für die Parameter, die Sie speichern möchten. Daten können auf zwei Arten gespeichert werden: Eine wird in den Attributen des Knotens gespeichert, die andere wird im Text des Knotens gespeichert.

Da ein Knoten viele Attribute haben kann, aber nur ein innererText, im hinzugefügt werden muss Programm Die Unterscheidung dieser beiden Formen führt zu Komplikationen. Um dieses Problem zu vermeiden, wird die Konfigurationsdatei von .net nur mit Attributen gespeichert, anstatt innertext.


Als nächstes schreiben wir eine benutzerdefinierte Konfigurationsdatei, die dieser unausgesprochenen Regel entspricht, um das Testen zu erleichtern:

 

<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>

Als nächstes schreiben wir die entsprechende Verarbeitungsklasse, hier schreiben wir von innen nach außen:

Zuerst ist der innerste 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;
            }

        }



    }

Dann gibt es MailServer, eine Sammlung von MailServern:

 /// <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();
        }
    }

Die letzte ist die äußerste Gruppe:

 /// <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;
            }

        }
    }

Ebenso die Assoziationsverarbeitungsklasse und Knoten:

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

Führen Sie dann einen Test durch:

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();

        }

    }

Ursprünglich wollte ich ein Bild der Ergebnisse hochladen, aber die Internetgeschwindigkeit ist langsam, vergessen Sie es, ich werde die Ergebnisse selbst ausführen, wenn ich gerne spiele. . . . .

Das Obige ist der Inhalt der .Net-Konfigurationsdatei – erbt ConfigurationSection, um benutzerdefinierte Verarbeitungsklassen zu implementieren, um benutzerdefinierte Konfigurationsknoten zu verarbeiten. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn )!






Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn