程序配置项管理-------appsettings.json文件

简要介绍

appsettings.json是微软目前最为推荐的配置项管理方式,其不仅适用于Asp.Net Core也可以用于WPF、Winform等项目。

在VS中添加appsettings.json文件

image

如何使用appsettings.json文件

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

基础用法

  1. 首先配置appsettings.json文件的内容。然后将其生成操作设置为「较新时复制」或「总是复制」,这样在项目构建时,appsettings.json 文件会被复制到输出目录中。
点击查看代码
{
  "Logging": {
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  },
  "ConnectionStrings": {
    "Default": "111"
  }
}
  1. 在项目中读取Json文件。
点击查看代码
private void ConfigureJson()
{
    var configure = new ConfigurationBuilder()
        //设置配置项的根目录
        .SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
        //读取当前目录下的配置文件
        .AddJsonFile("appsettings.json")
        //生成配置项
        .Build();
}
  1. 访问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"]);
    }
}
在这段代码中,程序首先读取的到的是最初配置的111,随后我们修改Json文件的值为222(此处修改的是输出目录中的Json文件,不是在VS项目中的那个),随后程序不断输出222。

读取多个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.jsonappsettings.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
  }
}

对于,这种情况我们就可以使用强类型配置项,在读取数据时就完成相应的类型转换。

  1. 首先,我们需要安装一个额外的库。
    image

  2. 在项目创建一个与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模式,实现强类型配置项的热重载。

posted @ 2025-07-19 14:56  Ytytyty  阅读(736)  评论(0)    收藏  举报