ASP.NET Core - 配置系统之配置提供程序
3. 配置提供程序
前面的章节提到,通过 IConfigurationBuilder 的实现类对象,我们可以自由地往配置系统中添加不同的配置提供程序,从而获取不同来源的配置信息。.NET Core 中,微软提供了以下这些内置的配置提供程序:
- 文件配置提供程序
- 环境变量配置提供程序
- 命令行配置提供程序
- Azure应用配置提供程序
- Azure Key Vault 配置提供程序
- Key-per-file配置提供程序
- 内存配置提供程序
- 应用机密(机密管理器)
- 自定义配置提供程序
这里稍微介绍一下常用的几个。
3.1 文件配置提供程序
顾名思义,这个就是我们熟悉的配置加载方式,从配置文件中加载配置信息。配置文件多种多样,.NET Core 框架内置支持 Json、xml、ini 三种格式的文件提供程序:
- JSON配置提供程序(JsonConfigurationProvider)
- XML配置提供程序(XmlConfigurationProvider)
- INI配置提供程序(IniConfigurationProvider)
以上这些配置提供程序,均继承于抽象基类 FileConfigurationProvider,当一个提供程序中发现重复的键时,提供程序会引发 FormatException,所有类型的文件提供程序都是这样的机制。
另外,所有文件配置提供程序都支持提供两个配置参数:
- optional:bool 类型,指示该文件是否是可选的。如果该参数为false,但是指定的文件又不存在,则会报错。
- reloadOnChange:bool 类型,指示该文件发生更改时,是否要重新加载配置。
3.1.1 JSON配置提供程序
JSON 配置提供程序被封装在 Microsoft.Extensions.Configuration.Json Nuget包中,若通过 ConfigurationBuilder 自行构建配置系统需要先安装该依赖包。它通过 JsonConfigurationProvider 在运行时从 Json 文件中加载配置。
使用方式非常简单,通过 IConfigurationBuilder 的实现类对象调用 AddJsonFile 扩展方法指定Json配置文件的路径即可。以下代码可用于控制台程序中创建主机并设置配置系统:
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using var host = Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) =>
{
// 清除原有的配置提供程序
config.Sources.Clear();
var env = context.HostingEnvironment;
// 添加 json 配置文件
config.AddJsonFile("appsettings.json",true, true)
.AddJsonFile($"appsetting.{
env.EnvironmentName}.json", true, true);
})
.Build();
var configuration = host.Services.GetService<IConfiguration>();
Console.WriteLine($"Settings:Provider: {
configuration.GetValue<string>("Settings:Provider")}");
host.Run();
appsetting.json 配置文件中的内容如下:
{
"Settings": {
"Provider": "JsonProvider",
"version": {
"subKey1": "value",
"subKey2": 1
},
"items": [ "item1", "item2", "item3" ]
}
}
控制台程序运行之后输出如下:
这样有一点要注意的是,对于我们手动添加的配置文件需要设置一下文件属性,让其在项目生成的时候能够正常生成到运行目录,确保应用可以正常获取到该文件:
3.1.2 XML配置提供程序
XML 配置提供程序被封装在 Microsoft.Extensions.Configuration.Xml Nuget包中,通过 XmlConfigurationProvider 类在运行时从 XML 文件加载配置。
使用方式也很简单,与 JSON 配置提供程序类似,通过 AddXmlFile 扩展方法指定配置文件路径。
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using var host = Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) =>
{
// 清除原有的配置提供程序
config.Sources.Clear();
var env = context.HostingEnvironment;
添加 json 配置文件
//config.AddJsonFile("appsettings.json",true, true)
// .AddJsonFile($"appsetting.{env.EnvironmentName}.json", true, true);
config.AddXmlFile("appsettings.xml", true, true);
})
.Build();
var configuration = host.Services.GetService<IConfiguration>();
Console.WriteLine($"Settings:Provider: {
configuration.