适用场景

  • 在Docker中运行时
  • 在Kubernetes中运行时
  • 需要设置ASP.NET Core的一些内置特殊配置时

我们当时一个操作系统会跑多个应用程序,应用程序注入配置的方式一般都是通过文件或者说是命令行的方式来注入的。现在在容器化的环境下面,有了Docker的隔离能力,就意味着每一个应用程序都相当于跑在一个小型的操作系统下面一样,所以说这个时候Docker提供的环境隔离能力,让我们可以使用环境变量来配置我们的引用程序。

特点

  • 对于配置的分层键,支持用双下划线“_”代替“:
    • 比如Linux下面,冒号作为环境变量的key值时不行的。
  • 支持根据前缀加载

示例

新建控制台应用程序:右键👉属性👉调试👉环境变量
image.png
同样的,这里的配置和launchSettings.json是一样的
image.png

  1. using Microsoft.Extensions.Configuration;
  2. using System;
  3. namespace ConfigurationEnvironmentVariablesDemo
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. var builder = new ConfigurationBuilder();
  10. builder.AddEnvironmentVariables();
  11. var root = builder.Build();
  12. // input:KEY1 : VALUE1
  13. Console.WriteLine($"KEY1 : {root["KEY1"]}");
  14. }
  15. }
  16. }

上述提到的分层键的问题,这里环境变量定义了一个分层键SECTION,使用了双下划线分割,这个SECTION下面有一个KEY2的key。
对应的代码:

  1. using Microsoft.Extensions.Configuration;
  2. using System;
  3. namespace ConfigurationEnvironmentVariablesDemo
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. var builder = new ConfigurationBuilder();
  10. builder.AddEnvironmentVariables();
  11. var root = builder.Build();
  12. // input : SECTION_VALUE2
  13. var section = root.GetSection("SECTION");
  14. Console.WriteLine(section["KEY2"]);
  15. }
  16. }
  17. }

image.png
多级的分层键也是一样的,和之前一样使用套娃去获取,或者使用以下方式。
launchSettings.json中添加SECTION__SECTION2__KEY1": "SECTION__SECTION2__VALUE1
image.png
使用var section = root.GetSection("SECTION:SECTION2");获取,输出:
image.png
可以看到获取的时候还是使用的冒号,说明程序会自动的识别双下划线。

前缀过滤
前缀过滤是指我们在注入环境变量的时候,指定一个前缀,意味着我们只注入我们指定前缀的环境变量,而不是把整个操作系统的所有环境变量注入进去

  1. using Microsoft.Extensions.Configuration;
  2. using System;
  3. namespace ConfigurationEnvironmentVariablesDemo
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. var builder = new ConfigurationBuilder();
  10. builder.AddEnvironmentVariables("T_");
  11. var root = builder.Build();
  12. Console.WriteLine($"T_KEY1 : {root["KEY1"]}");
  13. }
  14. }
  15. }

输出:image.png
image.png