# 第10课：环境变量配置提供程序

环境变量的配置提供程序主要适应场景：

1、在 Docker 中运行时

2、在 Kubernetes 中运行时

3、需要设置 ASP.NET Core 的一些内置特殊配置时

环境变量和命令行这两个提供程序在早期是没有容器化的，当时一个操作系统会跑多个应用程序，应用程序注入配置的方式一般都是通过文件或者是命令行的方式来注入的，环境变量当时用的比较少

现在在容器化的环境下，有了 Docker 的隔离能力，就意味着每一个应用程序都相当于跑在一个小型的操作系统下面一样，所以说这个时候 Docker 提供的环境隔离能力让我们可以使用环境变量来配置应用程序，在 Docker 和 Kubernetes 中，会大量使用环境变量，而不是使用命令行来配置基础配置

环境变量的配置有如下特点：

1、对于配置的分层键，支持使用双下横线 "\_\_" 代替 ":"

2、支持根据前缀加载

在某些操作系统，比如说 Linux 下面，冒号作为环境变量的 Key 值是不行的，所以说这里支持用双下划线来代替冒号，也就是说当遇到双下划线的环境变量时，可以认为这是一个分层键

环境变量提供程序还支持根据环境变量的前缀来加载

接下来时代码演示

首先引入三个包

* Microsoft.Extensions.Configuration.Abstractions
* Microsoft.Extensions.Configuration
* Microsoft.Extensions.Configuration.EnvironmentVariables

然后看一下环境变量如何在调试环境下注入

右键项目，属性，调试，环境变量

![](https://3621256661-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVizOiU5NHZ3U95Qy88Xl%2Fuploads%2FntZUQrUt9ZLUOdIPZg6n%2F141.jpg?alt=media\&token=c2afd93f-437d-4c28-9cc2-f7cb673787f9)

同样的在 Properties 下的 launchSettings.json 可以看到配置

```
{
  "profiles": {
    "ConfigurationEnvironmentVariablesDemo": {
      "commandName": "Project",
      "environmentVariables": {
        "KEY1": "value1",
        "KEY2": "value2",
        "SECTION1__KEY3": "value3",
        "SECTION1__SECTION2__KEY4": "value4",
        "XIAO_KEY1": "xiao key1"
      }
    }
  }
}
```

主程序

```
namespace ConfigurationEnvironmentVariablesDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            var builder = new ConfigurationBuilder();
            builder.AddEnvironmentVariables();

            var configurationRoot = builder.Build();
            Console.WriteLine($"key1:{configurationRoot["key1"]}");
        }
    }
}
```

启动程序，输出如下：

```
key1:value1
```

分层键

```
// "SECTION1__KEY3": "value3"
// 我们定义了一个分层键 SECTION1，用双下划线隔开，这个 section 下面有一个 KEY3 的 Key
var section = configurationRoot.GetSection("SECTION1");
Console.WriteLine($"KEY3:{section["KEY3"]}");
```

启动程序，输出如下：

```
KEY3:value3
```

多级分层键

```
// "SECTION1__SECTION2__KEY4": "value4"
var section2 = configurationRoot.GetSection("SECTION1:SECTION2");
Console.WriteLine($"KEY4:{section2["KEY4"]}");
```

启动程序，输出如下：

```
KEY4:value4
```

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

```
// "XIAO_KEY1": "xiao key1"
// build 之后把读取到的环境变量的前缀去掉
builder.AddEnvironmentVariables("XIAO_");
var configurationRoot = builder.Build();
Console.WriteLine($"KEY1:{configurationRoot["KEY1"]}");
// "KEY2": "value2"
// 在注入的时候，凡是没有 XIAO_ 开头的 Key 都没有注入进来，仅注册进来需要的一个环境变量值
// 适合当需要加载特定的值，去掉系统其他值的干扰项的场景使用
Console.WriteLine($"KEY2:{configurationRoot["KEY2"]}");
```

启动程序，输出如下：

```
KEY1:xiao key1
KEY2:value2
```

GitHub源码链接：<https://github.com/MingsonZheng/DotNetCoreDevelopmentActualCombat/tree/main/ConfigurationEnvironmentVariablesDemo>
