配置节
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 指定为它即可。