ASP.NET Core 中的配置是使用一个或多个配置提供程序执行的。 配置提供程序使用各种配置源从键值对读取配置数据:
- 设置文件,例如 appsettings.json
- 环境变量
- 命令行参数
- 内存中的 .NET 对象
内存中的.NET对象
MemoryConfigurationProvider 使用内存中集合作为配置键值对。
以下代码将内存集合添加到配置系统中:
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) { var Dict = new Dictionary<string, string> { {"MyKey", "Dictionary MyKey Value"}, {"Position:Title", "Dictionary_Title"}, {"Position:Name", "Dictionary_Name" }, {"Logging:LogLevel:Default", "Warning"} }; return Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostingContext, config) => { config.AddInMemoryCollection(Dict); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); } }
以下示例代码显示了上述配置设置:
public class TestModel : PageModel { // requires using Microsoft.Extensions.Configuration; private readonly IConfiguration Configuration; public TestModel(IConfiguration configuration) { Configuration = configuration; } public ContentResult OnGet() { var myKeyValue = Configuration["MyKey"]; var title = Configuration["Position:Title"]; var name = Configuration["Position:Name"]; var defaultLogLevel = Configuration["Logging:LogLevel:Default"]; return Content($"MyKey value: {myKeyValue} " + $"Title: {title} " + $"Name: {name} " + $"Default Log Level: {defaultLogLevel}"); } }
命令行配置提供程序
组件包:Microsoft.Extensions.Configuration.CommandLine
支持的命令格式:
- 无前缀的key=value模式
- 双中横线模式 --key=value 或 --key value
- 正斜杠模式 /key=value 或 /key value
Tips:等号分隔符和空格分隔符不能混用
命令替换模式(为命令取别名):
- 必须以单划线 (-) 或双划线 (--)开头
- 映射字典不能包含重复Key
我们创建一个.Net Core Console项目,为项目添加组件包
设置程序参数:
class Program { static void Main(string[] args) { var builder = new ConfigurationBuilder(); builder.AddCommandLine(args); var configurationRoot = builder.Build(); Console.WriteLine($"CommandLineKey1: {configurationRoot["Key1"]}"); Console.WriteLine($"CommandLineKey2: {configurationRoot["Key2"]}"); Console.WriteLine($"CommandLineKey3: {configurationRoot["Key3"]}"); Console.ReadKey(); } }
输出结果:
我们在试试用k1变量的值来替换Key1
添加映射:
查看输出:
环境变量配置
组件包:Microsoft.Extensions.Configuration.EnvironmentVariables
使用场景:
- 在 Docker 中运行时
- 在 Kubernets 中运行时
- 需要设置 ASP.NET Core 的一些内置特殊配置时
由于容器的环境隔离能力,使得我们可以使用环境变量来配置我们的应用程序。
特征:
所有平台上的环境变量分层键都不支持 :
分隔符。
__
(双下划线):
- 受所有平台支持。 例如,Bash 不支持
:
分隔符,但支持__
。 - 自动替换为
:
在调试环境下注入:
提取方法大同小异就不在赘述。
前缀过滤:
使用builder.AddEnvironmentVariables("Min_");方法则可过滤掉除了前缀为Min_的其他环境变量。
文件配置提供程序
FileConfigurationProvider 是从文件系统加载配置的基类。 以下配置提供程序派生自 FileConfigurationProvider
:
JSON 配置提供程序
JsonConfigurationProvider 从 JSON 文件键值对加载配置。
重载可以指定:
- 文件是否可选。
- 如果文件更改,是否重载配置。
C# public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostingContext, config) => { config.AddJsonFile("MyConfig.json", optional: true, reloadOnChange: true); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); }
前面的代码:
- 通过以下选项将 JSON 配置提供程序配置为加载 MyConfig.json 文件:
optional: true
:文件是可选的。reloadOnChange: true
:保存更改后会重载文件。应用程序在读取Json的值在文件变化时,读取的值也会变化。
Json
{ "Position": { "Title": "“我的配置”标题", "Name": "My Config Smith" }, "MyKey": "MyConfig.json Value", "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "AllowedHosts": "*" }
public class TestModel : PageModel { // requires using Microsoft.Extensions.Configuration; private readonly IConfiguration Configuration; public TestModel(IConfiguration configuration) { Configuration = configuration; } public ContentResult OnGet() { var myKeyValue = Configuration["MyKey"]; var title = Configuration["Position:Title"]; var name = Configuration["Position:Name"]; var defaultLogLevel = Configuration["Logging:LogLevel:Default"]; return Content($"MyKey value: {myKeyValue} " + $"Title: {title} " + $"Name: {name} " + $"Default Log Level: {defaultLogLevel}"); } }