环境变量配置方式
适用场景
- 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");
这里,以"env1"来进行过滤演示,下面代码中我已经列出了全部可能的情况,请注意观察以便你理解。
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
特性
- 可指定文件可选、必选:属性optional
- 可指定是否监视文件的变更:属性reloadOnChange
代码示例
这里,我们以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);
这里需要注意一下,如果多个文件中存在相同键,那么后加载的配置会覆盖先加载的配置。
本节到这里就要结束了,而且配置框架的4种方式也已经讲解完了,其实4种框架,除了应用方式不同外,其他的对配置的操作基本相同,只要认真写一遍,基本上都可以很快理解。下一篇,我们将会接着来学习配置热更新能力和用强类型承载配置的方式。最后,我们会一起实现用自定义数据源实现定制化的配置方案。
详细代码请参阅
https://github.com/IronMarmot/Samples/tree/master/CoreSamples