---
description: 学习分享 丨作者 / 郑 子 铭 丨公众号 / DotNet NB / CloudNative NB
---

# 第11课：文件配置提供程序

文件配置提供程序

* Microsoft.Extensions.Configuration.Ini
* Microsoft.Extensions.Configuration.Json
* Microsoft.Extensions.Configuration.NewtonsoftJson
* Microsoft.Extensions.Configuration.Xml
* Microsoft.Extensions.Configuration.UserSecrets

这些都是读取不同文件的格式，或者从不同的位置来读取文件

文件提供程序支持

* 文件是否可选
* 监视文件的变更

下面通过代码来了解这些特性

引用以下四个包：

* Microsoft.Extensions.Configuration
* Microsoft.Extensions.Configuration.Abstractions
* Microsoft.Extensions.Configuration.Ini
* Microsoft.Extensions.Configuration.Json

新增 appsettings.json，右键属性，复制到输出目录，如果较新则复制

```
{
  "Key1": "Value1",
  "Key2": "Value2"
}
```

主程序

```
var builder = new ConfigurationBuilder();
builder.AddJsonFile("appsettings.json");
var configurationRoot = builder.Build();

Console.WriteLine($"Key1:{configurationRoot["Key1"]}");
Console.WriteLine($"Key2:{configurationRoot["Key2"]}");
Console.WriteLine($"Key3:{configurationRoot["Key3"]}");
Console.ReadKey();
```

启动程序，输出如下：

```
Key1:Value1
Key2:Value2
Key3:
```

Key3 不存在，所以他的值是空的

文件是否可选是它的第二个参数 optional，默认情况下是 false

```
builder.AddJsonFile("appsettings.json", optional:false);
```

这意味当文件不存在的时候它会报错

它的另一个参数是 reloadOnChange， 默认情况下是 true

```
builder.AddJsonFile("appsettings.json", optional:false, reloadOnChange:true);
```

这意味着每次文件变更，它会去读取新文件

新增 appsettings.ini，右键属性，复制到输出目录，如果较新则复制

```
Key3=Value3 in ini
```

主程序

```
var builder = new ConfigurationBuilder();
builder.AddJsonFile("appsettings.json", optional:false, reloadOnChange:true);
builder.AddIniFile("appsettings.ini");
var configurationRoot = builder.Build();

Console.WriteLine($"Key1:{configurationRoot["Key1"]}");
Console.WriteLine($"Key2:{configurationRoot["Key2"]}");
Console.WriteLine($"Key3:{configurationRoot["Key3"]}");
Console.ReadKey();
```

启动程序，输出如下：

```
Key1:Value1
Key2:Value2
Key3:Value3 in ini
```

这里可以看到新添加的配置已经生效

builder 中添加配置源是有顺序关系的，后添加的配置会覆盖先添加的配置

GitHub源码链接：[https://github.com/MingsonZheng/DotNetCoreDevelopmentActualCombat/tree/main/ConfigurationFileDemo](https://github.com/MingsonZheng/DotNetCoreDevelopmentActualCombat/tree/main/ConfigurationFileDemo)
