配置节


1、ConfigurationSection 类

  ConfigurationSection 是一个抽象类,它提供了两个方法:

  • Initialize 方法用于从 Xml 节点中解析出配置项。

  • Bind 方法用于绑定 IConfiguration 中的节点(.Net Sandard) 的相关配置项。


2、ConfigurationSection<T> 类

  这是继承自 ConfigurationSection 的一个泛型抽象类,它实现了标准的 Initialize 和 Bind 方法,并通过 Settings 属性提供访问多个配置项的能力。Settings 是一个字典类型的对象,可以通过 Key 来访问配置项。下面通过一个示例来说明配置节、配置项与配置文件的关系:

  • .Net Framework 下的 app.config 或 web.config 文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="fireasy">
      <section name="loggings" type="Fireasy.Common.Logging.Configuration.LoggingConfigurationSectionHandler, Fireasy.Common" />
    </sectionGroup>
  </configSections>
  <fireasy>
    <loggings>
      <logging name="log4net" type="Fireasy.Log4net.Logger, Fireasy.Log4net"></logging>
      <logging name="nlog" type="Fireasy.NLog.Logger, Fireasy.NLog"></logging>
    </loggings>
  </fireasy>
</configuration>
  • .Net Core 下的 appsettings.json 文件
{
  "fireasy": {
    "loggings": {
      "settings": {
        "log4net": {
          "type": "Fireasy.Log4net.Logger,Fireasy.Log4net"
        },
        "nlog": {
          "type": "Fireasy.NLog.Logger,Fireasy.NLog"
        }
      }
    }
  }
}

  对于 .Net Framework 的配置文件,loggings 即是配置节,logging 即是配置项。而 .Net Core 的配置文件,其配置节和配置项皆以字典的方式定义。Settings 属性有两个配置项,其 Key 分别为 log4net 和 nlog。

  在每一类组件命名空间的 Configuration 下,都会有一个以 ConfigurationSection 结尾的类,这个类使用 ConfigurationSectionStorageAttribute 特性标记其存储在配置文件中的位置,另外在类的注释上已经明确说明了配置节的路径,配置的时候可以参考该类的注释。如 LoggingConfigurationSection 类定义如下:

/// <summary>
/// 表示日志的配置节。无法继承此类。
/// 对应的配置节为 fireasy/loggings(.net framework) 或 fireasy:loggings(.net core)。
/// </summary>
[ConfigurationSectionStorage("fireasy/loggings")]
public sealed class LoggingConfigurationSection : ManagableConfigurationSection<LoggingConfigurationSetting>
{
}

3、DefaultInstaneConfigurationSection<T> 类

  DefaultInstaneConfigurationSection<T> 是一个继承自 ConfigurationSection<T> 的抽象类,在原有的基础上,增加了两个属性:

  • DefaultInstanceName 默认配置项的名称。

  • Default 默认配置项。

  还是以上面的配置示例进行说明,增加了 default 的设置,表示默认情况下所使用的配置项:

  • .Net Framework 下的 app.config 或 web.config 文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="fireasy">
      <section name="loggings" type="Fireasy.Common.Logging.Configuration.LoggingConfigurationSectionHandler, Fireasy.Common" />
    </sectionGroup>
  </configSections>
  <fireasy>
    <loggings default="nlog">
      <logging name="log4net" type="Fireasy.Log4net.Logger, Fireasy.Log4net"></logging>
      <logging name="nlog" type="Fireasy.NLog.Logger, Fireasy.NLog"></logging>
    </loggings>
  </fireasy>
</configuration>
  • .Net Core 下的 appsettings.json 文件
{
  "fireasy": {
    "loggings": {
      "default": "nlog",
      "settings": {
        "log4net": {
          "type": "Fireasy.Log4net.Logger,Fireasy.Log4net"
        },
        "nlog": {
          "type": "Fireasy.NLog.Logger,Fireasy.NLog"
        }
      }
    }
  }
}

  如果不指定 default,则会使用第一个配置项作为默认配置项。


4、ManagableConfigurationSection<T> 类

  ManagableConfigurationSection<T> 是一个继承自 DefaultInstaneConfigurationSection<T> 的抽象类,它提供一个 Factory 属性以指定一个 IManagedFactory 来创建实例。像日志、缓存这些组件的配置节都是继承自此抽象类,在 实例委托工厂 里会进行介绍。


💡 多说一句

  .Net Framework 的配置文件,首先得声明 configSections / sectionGroup / section 节,每一类组件命名空间的 Configuration 下,都会有一个以 ConfigurationSectionHandler 结尾的类,将 type 指定为它即可。