程序配置项管理-------appsettings.json文件
简要介绍
appsettings.json是微软目前最为推荐的配置项管理方式,其不仅适用于Asp.Net Core也可以用于WPF、Winform等项目。
在VS中添加appsettings.json文件

如何使用appsettings.json文件
首先,需要去安装一个微软提供的第三方库,该库中提供了读写Json文件相关功能。在安装过程中,VS会自动安装该库的其他依赖库,不需要手动安装。

基础用法
- 首先配置appsettings.json文件的内容。然后将其生成操作设置为「较新时复制」或「总是复制」,这样在项目构建时,appsettings.json 文件会被复制到输出目录中。
点击查看代码
{
"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
},
"ConnectionStrings": {
"Default": "111"
}
}
- 在项目中读取Json文件。
点击查看代码
private void ConfigureJson()
{
var configure = new ConfigurationBuilder()
//设置配置项的根目录
.SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
//读取当前目录下的配置文件
.AddJsonFile("appsettings.json")
//生成配置项
.Build();
}
- 访问Json中的配置信息。在这种读取方式中,我们通过
:去表示Json文件中的层级关系实现配置文件的读取。但要注意的是,通过这种方式读取到的数据都是字符串类型的,需要手动转换到对应类型。
点击查看代码
var logLevel = configuration["Logging:LogLevel"];
var connectionString = configuration["ConnectionStrings:Default"];
// 数据类型转换
// 传统方法
var connectionString = int.Parse(configuration["ConnectionStrings:Default"]);
// 使用 GetValue 方法
var connectionString = configuration.GetValue<int>("ConnectionStrings:Default");
optional和reloadOnChange
这两个参数都是在向ConfigurationBuilder中添加Json文件时的可选参数。
- optional:参数表示是否允许配置文件不存在,如果设置为 false,则会抛出异常,否则会忽略。
- reloadOnChange 参数表示是否在配置文件发生变化时重新加载配置文件(热重载)。如果设置为 true,则会在配置文件发生变化时重新加载配置文件。
配置文件的热重载
对于reloadOnChange参数,通过下面的例子即可测试其效果。
点击查看代码
private async void ConfigureJson()
{
var configure = new ConfigurationBuilder()
//设置配置项的根目录
.SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
.AddJsonFile("appsettings.json",optional:false,reloadOnChange:true)
//生成配置项
.Build();
while (true)
{
await Task.Delay(1000);
Debug.WriteLine(configure["ConnectionStrings:Default"]);
}
}
读取多个Json文件
该部分主要涉及到optional参数的使用。
在创建配置项时,我们可以多次使用AddJsonFile方法添加多个Json文件。例如,我们在项目中额外添加一个appsettings.Development.json用来配置开发环境的配置信息。
点击查看代码
var configuration = new ConfigurationBuilder()
.SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile("appsettings.Development.json", optional: true, reloadOnChange: true)
.Build();
注意到,我们在添加appsettings.json时将optional值为false,标明该文件属于程序的通用配置信息,如果文件不存在则程序会抛出异常。反之,对于appsettings.Development.json,将optional值为true,表明该文件属于可选项,仅当文件位于输出目录下时才去读取。
通过这种方式,我们就实现了程序读取多个Json文件,但还需注意。对于Json文件的添加顺序,也会影响程序读取配置项的优先级。,具体效果如下。
- 如果 appsettings.json 和 appsettings.Development.json 中都有相同的配置项,那么 appsettings.Development.json 中的配置项会覆盖 appsettings.json 中的配置项。
- 如果 appsettings.Development.json 中没有某个配置项,而 appsettings.json 中有,那么会使用 appsettings.json 中的配置项。
- 如果 appsettings.Development.json 中有某个配置项,而 appsettings.json 中没有,那么会使用 appsettings.Development.json 中的配置项。
强类型配置项
在上面的方法中,我们通过configure["ConnectionStrings:Default"]这种方式获取到的数据都是字符串类型,必须进行手动转换后才能使用。这对于简单数据还好说,如果我们需要从配置项中数据实例化出一个配置参数类。例如下面的PlcParam,读取完后一个个转换就显得非常麻烦。
点击查看代码
{
"PlcParam": {
"PlcIp": "127.0.0.1",
"PlcPort": 103,
"PlcType": "S1200",
"PlcRack": 0,
"PlcSlot": 0,
"PlcConnectTimeOut": 100,
"PlcReConnectTime": 100,
"PlcCycleInterval": 300,
"AutoCollect": true,
"AutoMock": false,
"AutoConnect": true
}
}
对于,这种情况我们就可以使用强类型配置项,在读取数据时就完成相应的类型转换。
-
首先,我们需要安装一个额外的库。

-
在项目创建一个与Json相对应的参数类。
点击查看代码
public class PlcParam
{
public string PlcIp { get; set; }
public int PlcPort { get; set; }
public string PlcType { get; set; }
public byte PlcRack { get; set; }
public byte PlcSlot { get; set; }
public int PlcConnectTimeOut { get; set; }
public int PlcReConnectTime { get; set; }
public int PlcCycleInterval { get; set; }
public bool AutoCollect { get; set; }
public bool AutoMock { get; set; }
public bool AutoConnect { get; set; }
}
3.随后,我们就可以通过如下方式,实现强类型配置项的读取。
点击查看代码
private void ConfigureJson()
{
var configure = new ConfigurationBuilder()
//设置配置项的根目录
.SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
//添加当前目录下的Json文件
//optional=配置项是否可选,false时如果
//reloadOnChange配置文件改变时,是否重新读取
.AddJsonFile("appsettings.json",optional:false,reloadOnChange:true)
//生成配置项
.Build();
var plc = configure.GetSection("PlcParam").Get<PlcParam>();
}
但是需要注意,因为这里的 plc 实例已经初始化,所以前面提到的自动重载功能不再生效。如果需要自动重载,我们需要重新获取 PlcParam 对象。或者,我们也可以考虑在Service中开启Options模式,实现强类型配置项的热重载。

浙公网安备 33010602011771号