Maison développement back-end Tutoriel C#.Net Fichier de configuration .Net - hérite de ConfigurationSection pour implémenter des classes de traitement personnalisées afin de traiter les nœuds de configuration personnalisés

Fichier de configuration .Net - hérite de ConfigurationSection pour implémenter des classes de traitement personnalisées afin de traiter les nœuds de configuration personnalisés

Feb 24, 2017 am 10:29 AM

En plus d'utiliser la méthode d'héritage de IConfigurationSectionHandler pour définir une classe de traitement des nœuds personnalisés, vous pouvez également obtenir le même effet en héritant de la classe ConfigurationSection.

Tout d'abord, parlons d'une règle tacite dans le fichier de configuration .Net

Lors de la configuration d'un nœud, pour le paramètres que vous souhaitez stocker Les données peuvent être stockées de deux manières : l'une est stockée dans les attributs du nœud et l'autre est stockée dans le texte du nœud.

Parce qu'un nœud peut avoir de nombreux attributs, mais il n'y a qu'un seul texteintérieur, et il doit être ajouté au programme. La différenciation de ces deux formes crée des complications. Afin d'éviter ce problème, le fichier de configuration de .net est uniquement stocké avec des attributs au lieu d'utiliser innertext.


Ensuite, nous écrivons un fichier de configuration personnalisé conforme à cette règle tacite pour faciliter les tests :

 

<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>
Copier après la connexion

Ensuite, nous écrivons la classe de traitement correspondante, ici nous écrivons de l'intérieur vers l'extérieur :

Le premier est le serveur de messagerie le plus interne :

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

        }



    }
Copier après la connexion

Ensuite, il y a les serveurs de messagerie, qui sont une collection de serveurs de messagerie :

 /// <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();
        }
    }
Copier après la connexion

Le dernier est le groupe le plus extérieur :

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

        }
    }
Copier après la connexion

De même, le classe de traitement d'association et Node :

 <section name="mailServerGroup" type="继承ConfigurationSection基类.MailServerSection,继承ConfigurationSection基类"/>   
  </configSections>
Copier après la connexion

Puis faites un test :

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

        }

    }
Copier après la connexion

Au départ, je voulais télécharger une photo des résultats, mais la vitesse d'Internet est lente, oubliez ça, je lancerai les résultats moi-même si j'aime jouer. . . . .

Ce qui précède est le contenu du fichier de configuration .Net - héritant de ConfigurationSection pour implémenter des classes de traitement personnalisées pour traiter les nœuds de configuration personnalisés. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois. (www.php.cn) !





Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment activer ou désactiver eSIM sur Windows 11 Comment activer ou désactiver eSIM sur Windows 11 Sep 20, 2023 pm 05:17 PM

Si vous avez acheté votre ordinateur portable auprès d'un opérateur mobile, vous aviez probablement la possibilité d'activer une eSIM et d'utiliser votre réseau cellulaire pour connecter votre ordinateur à Internet. Avec eSIM, vous n'avez pas besoin d'insérer une autre carte SIM physique dans votre ordinateur portable car elle est déjà intégrée. C'est très utile lorsque votre appareil ne peut pas se connecter au réseau. Comment vérifier si mon appareil Windows 11 est compatible eSIM ? Cliquez sur le bouton Démarrer et accédez à Réseau et Internet > Cellulaire > Paramètres. Si vous ne voyez pas l'option « Cellulaire », votre appareil ne dispose pas de fonctionnalités eSIM et vous devez cocher une autre option, comme utiliser votre appareil mobile pour connecter votre ordinateur portable à un point d'accès. Afin d'activer et

Hyper complet ! Méthodes courantes d'écriture de fichiers de configuration en Python Hyper complet ! Méthodes courantes d'écriture de fichiers de configuration en Python Apr 11, 2023 pm 10:22 PM

Pourquoi devrions-nous écrire le fichier fixe du fichier de configuration ? Nous pouvons l'écrire directement sous forme de fichier .py, tel que settings.py ou config.py. L'avantage est que nous pouvons en importer directement des parties via l'importation dans le fichier. même projet ; mais si nous devons l'utiliser dans d'autres cas. Lors du partage de fichiers de configuration sur des plates-formes non Python, écrire un seul .py n'est pas un bon choix. À ce stade, nous devons choisir un type de fichier de configuration commun pour stocker ces parties fixes. Actuellement, les types de formats de fichiers de configuration couramment utilisés et populaires incluent principalement ini, json, toml, yaml, xml, etc. Nous pouvons accéder à ces types de fichiers de configuration via des bibliothèques standard ou des bibliothèques tierces.

Comment changer le type de réseau en privé ou public dans Windows 11 Comment changer le type de réseau en privé ou public dans Windows 11 Aug 24, 2023 pm 12:37 PM

La configuration d'un réseau sans fil est courante, mais choisir ou modifier le type de réseau peut prêter à confusion, surtout si vous n'en connaissez pas les conséquences. Si vous recherchez des conseils sur la façon de changer le type de réseau de public à privé ou vice versa dans Windows 11, lisez la suite pour obtenir des informations utiles. Quels sont les différents profils réseau dans Windows 11 ? Windows 11 est livré avec un certain nombre de profils réseau, qui sont essentiellement des ensembles de paramètres pouvant être utilisés pour configurer diverses connexions réseau. Ceci est utile si vous disposez de plusieurs connexions à la maison ou au bureau afin que vous n'ayez pas à tout configurer à chaque fois que vous vous connectez à un nouveau réseau. Les profils de réseau privé et public sont deux types courants dans Windows 11, mais généralement

Où est le profil utilisateur Win10 ? Comment configurer le profil utilisateur dans Win10 ? Où est le profil utilisateur Win10 ? Comment configurer le profil utilisateur dans Win10 ? Jun 25, 2024 pm 05:55 PM

Récemment, de nombreux utilisateurs du système Win10 souhaitent modifier le profil utilisateur, mais ils ne savent pas comment le faire. Cet article vous montrera comment définir le profil utilisateur dans le système Win10 ! Comment configurer un profil utilisateur dans Win10 1. Tout d'abord, appuyez sur les touches « Win+I » pour ouvrir l'interface des paramètres, puis cliquez pour accéder aux paramètres « Système ». 2. Ensuite, dans l'interface ouverte, cliquez sur « À propos » sur la gauche, puis recherchez et cliquez sur « Paramètres système avancés ». 3. Ensuite, dans la fenêtre contextuelle, passez à la barre d'options "" et cliquez sur "Configuration utilisateur" ci-dessous.

Quelles sont les perspectives d'emploi du C# ? Quelles sont les perspectives d'emploi du C# ? Oct 19, 2023 am 11:02 AM

Que vous soyez débutant ou professionnel expérimenté, la maîtrise du C# ouvrira la voie à votre carrière.

Partagez plusieurs frameworks de projets open source .NET liés à l'IA et au LLM Partagez plusieurs frameworks de projets open source .NET liés à l'IA et au LLM May 06, 2024 pm 04:43 PM

Le développement des technologies d’intelligence artificielle (IA) bat son plein aujourd’hui et elles ont montré un grand potentiel et une grande influence dans divers domaines. Aujourd'hui, Dayao partagera avec vous 4 cadres de projets liés au modèle d'IA open source .NET LLM, dans l'espoir de vous fournir une référence. https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.mdSemanticKernelSemanticKernel est un kit de développement logiciel (SDK) open source conçu pour intégrer de grands modèles de langage (LLM) tels qu'OpenAI, Azure

Hyper complet ! Méthodes courantes d'écriture de fichiers de configuration en Python Hyper complet ! Méthodes courantes d'écriture de fichiers de configuration en Python Apr 13, 2023 am 08:31 AM

Pourquoi écrire des fichiers de configuration ? Pendant le processus de développement, nous utilisons souvent des paramètres ou des constantes fixes. Pour ces parties plus fixes et couramment utilisées, elles sont souvent écrites dans un fichier fixe pour éviter la répétition dans différents codes de module et garder le code de base propre. Nous pouvons écrire directement ce fichier corrigé dans un fichier .py, tel que settings.py ou config.py. L'avantage est que nous pouvons en importer directement des parties via l'importation dans le même projet ; sur d'autres plates-formes non Python Lors de la configuration du partage de fichiers, écrire un seul .py n'est pas un bon choix. À ce stade, nous devrions choisir un type de fichier de configuration commun

Installer Helm sur Ubuntu Installer Helm sur Ubuntu Mar 20, 2024 pm 06:41 PM

Helm est un composant important de Kubernetes qui simplifie le déploiement des applications Kubernetes en regroupant les fichiers de configuration dans un package appelé HelmChart. Cette approche rend la mise à jour d'un seul fichier de configuration plus pratique que la modification de plusieurs fichiers. Avec Helm, les utilisateurs peuvent facilement déployer des applications Kubernetes, simplifiant ainsi l'ensemble du processus de déploiement et améliorant l'efficacité. Dans ce guide, j'aborderai différentes manières d'implémenter Helm sur Ubuntu. Remarque : les commandes du guide suivant s'appliquent à Ubuntu 22.04 ainsi qu'à toutes les versions d'Ubuntu et aux distributions basées sur Debian. Ces commandes sont testées et devraient fonctionner correctement sur votre système. en U

See all articles