Maison >développement back-end >C++ >Comment implémenter correctement une ConfigurationSection avec une ConfigurationElementCollection dans .NET ?

Comment implémenter correctement une ConfigurationSection avec une ConfigurationElementCollection dans .NET ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-27 05:38:09815parcourir

How to Correctly Implement a ConfigurationSection with a ConfigurationElementCollection in .NET?

Implémentation d'une ConfigurationSection avec une ConfigurationElementCollection

Lors de la personnalisation des configurations, vous pouvez rencontrer des problèmes lors de l'implémentation d'une section de configuration. Cet article traite de l'utilisation d'une ConfigurationSection avec une ConfigurationElementCollection, clarifiant les idées fausses et fournissant des conseils sur la mise en œuvre correcte.

Context

Vous avez défini une section de configuration personnalisée dans votre fichier App.config avec une ServicesSection. et un élément ServiceCollection. Cependant, malgré la création de classes d'éléments (ServiceConfig et ServiceCollection), vous avez rencontré des exceptions avec le gestionnaire de section de configuration.

Solution

Gestionnaire de section de configuration

Vous avez initialement tenté d'utiliser IConfigurationSectionHandler interface, qui est désormais obsolète. L’approche correcte consiste à créer une classe de section de configuration dérivée de ConfigurationSection. Dans votre cas, vous avez besoin d'une classe ServiceConfigurationSection. Cette classe doit définir une propriété Services qui est une ConfigurationCollection d'éléments ServiceConfig.

Implémentation de la collection de configuration

Dans votre classe ServiceCollection, assurez-vous d'étendre ConfigurationElementCollection et de remplacer les méthodes nécessaires pour créer de nouveaux éléments ( CreateNewElement), récupérer les clés d'élément (GetElementKey) et effectuer des opérations telles que l'ajout, la suppression et l'effacement éléments.

Code final

Voici le code complet pour les classes et la configuration nécessaires :

ServiceConfig :

public class ServiceConfig : ConfigurationElement
{
    [ConfigurationProperty("Port", DefaultValue = 0, IsRequired = true, IsKey = true)]
    public int Port { get; set; }

    [ConfigurationProperty("ReportType", DefaultValue = "File", IsRequired = true, IsKey = false)]
    public string ReportType { get; set; }
}

ServiceCollection :

public class ServiceCollection : ConfigurationElementCollection
{
    public override ConfigurationElement CreateNewElement() => new ServiceConfig();
    protected override object GetElementKey(ConfigurationElement element) => ((ServiceConfig)element).Port;
}

ServiceConfigurationSection :

public class ServiceConfigurationSection : ConfigurationSection
{
    [ConfigurationProperty("Services", IsDefaultCollection = false)]
    [ConfigurationCollection(typeof(ServiceCollection),
        AddItemName = "add",
        ClearItemsName = "clear",
        RemoveItemName = "remove")]
    public ServiceCollection Services => (ServiceCollection)base["Services"];
}

App.config Configuration :

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="ServicesSection" type="RT.Core.Config.ServiceConfigurationSection, RT.Core" />
    </configSections>
    <ServicesSection>
        <Services>
            <add Port="6996" ReportType="File" />
            <add Port="7001" ReportType="Other" />
        </Services>
    </ServicesSection>
</configuration>

Exemple de consommation :

ServiceConfigurationSection serviceConfigSection = ConfigurationManager.GetSection("ServicesSection") as ServiceConfigurationSection;
ServiceConfig serviceConfig = serviceConfigSection.Services[0];

En suivant ces étapes, vous pouvez implémenter avec succès une section de configuration personnalisée avec un élément de collection.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
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