环境变量配置方式
适用场景
- Docker中
- Kubernetes中
- 需要设置ASP.NET Core的一些内置特殊配置时
特性
- 对于配置的分层键,支持用双下划线“__”代替“:”
- 支持根据前缀加载
引用包
- Microsoft.Extensions.Configuration
- Microsoft.Extensions.Configuration.Abstractions
- Microsft.Extensions.Configuration.EnvironmentVariables
调试方式
我们可通过右键项目属性窗口,选择调试选项卡,在环境变量部分填写我们的测试数据
我们同样也可以通过lanchSettings.json文件来配置
{ "profiles": { "07_Configuration_Env": { "commandName": "Project", "environmentVariables": { "env1": "env1", "key2": "value2", "env1:key3": "value3", "env1__key4": "value4", "env1_": "env1_", "key1": "value1" } } } }
可通过
configurationBuilder.AddEnvironmentVariables();
来开启环境变量配置方式,测试代码如下
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); configurationBuilder.AddEnvironmentVariables(); IConfigurationRoot configurationRoot = configurationBuilder.Build(); Console.WriteLine($"key1:{configurationRoot["key1"]}"); Console.WriteLine($"key2:{configurationRoot["key2"]}"); IConfigurationSection section1 = configurationRoot.GetSection("env1"); Console.WriteLine($"key3:{section1["key3"]}"); Console.WriteLine($"key4:{section1["key4"]}");
前缀过滤
环境变量配置方式提供了一种前缀过滤的方式,来允许我们只注册特定前缀的环境变量,而无需每次都全部注册,这种方式下,获取值时,其键值是以定义键去掉前缀之后的剩余串作为键值的。
这里需要好好理解一下,我已经列出了全部可能得情况可以帮助你理解。
configurationBuilder.AddEnvironmentVariables("env1"); IConfigurationRoot configurationRoot = configurationBuilder.Build(); Console.WriteLine($"env1:{configurationRoot[""]}"); Console.WriteLine($"env1_:{configurationRoot["_"]}"); Console.WriteLine($"env1:key3:{configurationRoot[":key3"]}"); Console.WriteLine($"env1__key4:{configurationRoot["__key4"]}");//不能获取,猜测__是环境变量独有的识别为section的方式,因此必须通过section获取 IConfigurationSection configurationSection = configurationRoot.GetSection(""); Console.WriteLine($"key3:{configurationSection["key3"]}"); Console.WriteLine($"key4:{configurationSection["key4"]}");
文件提供程序配置:自由选择配置的格式
种类
- Microsoft.Extensions.Configuration.Ini
- Microsoft.Extensions.Configuration.Json
- Microsoft.Extensions.Configuration.NewtonsoftJson
- Microsoft.Extensions.Configuration.Xml
- Microsoft.Extensions.Configuration.UserSecrets
特性
- 可指定文件可选、必选
- 可指定是否监视文件的变更
代码示例
这里,我们以json和ini文件为例,先准备2个文件
{ "key1": "value1", "key2": 0, "Section1": { "key3": "value3", "key4": 10, "key5": "ture" } }
key6=value6 in ini
可通过
configurationBuilder.AddJsonFile("settings.json",optional:false,reloadOnChange:true); configurationBuilder.AddIniFile("settings.ini"); //...
开启文件提供程序配置方式,测试代码如下
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); configurationBuilder.AddJsonFile("settings.json"); configurationBuilder.AddIniFile("settings.ini"); IConfigurationRoot configurationRoot = configurationBuilder.Build(); Console.WriteLine($"key1:{configurationRoot["key1"]}"); Console.WriteLine($"key2:{configurationRoot["key2"]}"); Console.WriteLine($"key3:{configurationRoot["Section1:key3"]}");//也可获取 IConfigurationSection configurationSection = configurationRoot.GetSection("Section1"); Console.WriteLine($"key3:{configurationSection["key3"]}"); Console.WriteLine($"key4:{configurationSection["key4"]}"); Console.WriteLine($"key5:{configurationSection["key5"]}"); //ini Console.WriteLine($"key6:{configurationRoot["key6"]}");
文件可选
可用optional指定文件是否可选,默认是false,测试,若不存在文件,则会抛异常。
configurationBuilder.AddJsonFile("settings.json",optional:false);
文件变更监视
reloadOnChange可指定是否监视文件变更,默认为true
configurationBuilder.AddJsonFile("settings.json",optional:false,reloadOnChange:true);
这里需要注意一下,如果多个文件中存在相同键,那么后加载的配置会覆盖先加载的配置。
本节到这里就要结束了,下节讲解配置变更监听。
源码可访问
https://github.com/IronMarmot/Samples/tree/master/CoreSamples