首页 >后端开发 >C++ >如何在 .NET 中使用 ConfigurationElementCollection 正确实现 ConfigurationSection?

如何在 .NET 中使用 ConfigurationElementCollection 正确实现 ConfigurationSection?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-27 05:38:09813浏览

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

使用 ConfigurationElementCollection 实现 ConfigurationSection

自定义配置时,您可能会在实现配置部分时遇到问题。本文讨论了 ConfigurationSection 与 ConfigurationElementCollection 的使用,澄清了误解并提供了正确实现的指导。

上下文

您已使用 ServicesSection 在 App.config 文件中定义了自定义配置部分和一个 ServiceCollection 元素。但是,尽管创建了元素类(ServiceConfig 和 ServiceCollection),您还是在配置节处理程序中遇到了异常。

解决方案

配置节处理程序

您最初尝试使用 IConfigurationSectionHandler接口,现已弃用。正确的方法是创建一个派生自 ConfigurationSection 的配置节类。在您的情况下,您需要一个 ServiceConfigurationSection 类。此类应定义一个 Services 属性,该属性是 ServiceConfig 元素的 ConfigurationCollection。

配置集合实现

在 ServiceCollection 类中,请务必扩展 ConfigurationElementCollection 并重写必要的方法来创建新元素 ( CreateNewElement),检索元素键(GetElementKey),并执行添加、删除和清除元素等操作。

最终代码

以下是必要的类和配置的完整代码:

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配置:

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

消费示例:

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

按照以下步骤,您可以成功实现带有集合元素的自定义配置部分。

以上是如何在 .NET 中使用 ConfigurationElementCollection 正确实现 ConfigurationSection?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn