一、前言
在项目开发过程中,不可避免的会设置一些全局的可变的参数,如连接字符串、功能开关、Swagger配置、Redis配置等等。 .NET Core 将这些配置参数统一放在 appsettings.json 文件中进行管理,并提供了 IConfiguration 接口,在需要读取配置文件内容的类中,注入 IConfiguration 即可。 但是,.NET Core 默认是通过构造函数注入,而 appsettings.json 的内容是不会经常进行变动,如果每个需要获取配置值类,都先在构造函数注入 IConfiguration 才能使用,也挺烦的。 所以本篇文章介绍多种获取配置文件的方法。后面也会展示如何写一个公用类,对配置的读取进行简单的封装。二、读取配置文件
1、Json配置文件说明
1. 配置文件

2. json配置文件示例
{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"Setting": {"Url": "http://localhost:8080/","Name": "localhost"}}
2、读取配置文件的几种方式
1. 通过依赖注入直接读取
通过依赖注入的方式
[ApiController][Route("[controller]/[action]")]public class TestController: ControllerBase{public IConfiguration _configuration { get; set; }public TestController(IConfiguration configuration){_configuration = configuration;}/// <summary>/// 方式一:直接读取单个值/// </summary>[HttpGet, HttpPost]public void GetConfigDemo1(){var url = _configuration["Setting:Url"]; // http://localhost:8080/var url2 = _configuration.GetValue<string>("Setting:Url"); // http://localhost:8080/var url3 = _configuration.GetSection("Setting").GetSection("Url").Value; // http://localhost:8080/}}
2. 读取Json对象
如果想把json对象拿去使用的话,一般都是转成类去使用,毕竟对于类在熟悉不过了,方便又熟练 1)新建Json模块Setting类2)新建应用设置类AppSettings
/// <summary>/// Json模块Setting类/// </summary>public class SettingClass{/// <summary>/// 地址/// </summary>public string Url { get; set; }/// <summary>/// 名称/// </summary>public string Name { get; set; }}
3)在Startup.cs中调用AppSettings的初始化方法
/// <summary>/// 应用设置类/// 总类:对应json文件,确定json模块与对象/// 这里负责一一绑定json模块与对象/// </summary>public static class AppSettings{public static SettingClass settingClass { get; set; }public static void Init(IConfiguration configuration){// 将Setting模块绑定到Json模块的Setting类settingClass = new SettingClass();configuration.Bind("Setting", settingClass);}}

4)在控制器中使用(静态类 静态变量)
// AppSettings总类进行调用静态方法AppSettings.Init(Configuration);
[ApiController][Route("[controller]/[action]")]public class TestController: ControllerBase{public IConfiguration _configuration { get; set; }public TestController(IConfiguration configuration){_configuration = configuration;}/// <summary>/// 方式二:读取Json对象 - 变成类使用/// </summary>[HttpGet, HttpPost]public void GetConfigDemo2(){var url = AppSettings.settingClass.Url; // http://localhost:8080/var name = AppSettings.settingClass.Name; // localhost}}
3. 在注册服务中绑定实体类与Json文件,使用时声明为全局常量
1)在Startup.cs中将Json模块类与Json文件对应内容绑定(Json模块类如方式2的SettingClass类)
2)在控制器中使用 在用的地方IOptions
services.Configure<SettingClass> (option =>{option.Url = Configuration["Setting:Url"];option.Name = Configuration["Setting:Name"];});
[ApiController][Route("[controller]/[action]")]public class TestController: ControllerBase{public IConfiguration _configuration { get; set; }public string UrlStr { get; set; }public string NameStr { get; set; }public TestController(IConfiguration configuration, IOptions<SettingClass> settings){_configuration = configuration;UrlStr = settings.Value.Url;NameStr = settings.Value.Name;}/// <summary>/// 方法三:在注册服务的时候把配置文件与类绑定好值,使用时声明为全局常量/// </summary>[HttpGet, HttpPost]public void GetConfigDemo3(){var url = UrlStr; // http://localhost:8080/var name = NameStr; // localhost}}
更多方式请看一下文章:
三、公用类的封装
1、获取配置信息设置为全局变量
1. 声明一个静态类Common.cs
using System;using System.IO;using Microsoft.Extensions.Configuration;namespace test{public static class Common{public static string CommonUrl;static Common(){var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json");var config = builder.Build();var commonurl = config["CommonUrl"];CommonUrl = commonurl;}}}
2. 使用
Common.CommonUrl;
2、Json转类封装
1. 新建公共类:AppSettings.cs
新建文件夹 Helper 文件夹,帮助类都放此文件夹中。添加类 AppSettings.cs
using Microsoft.Extensions.Configuration;namespace AMO.Core.Helper{/// <summary>/// 读取配置文件帮助类/// </summary>public class AppSettings{#region 注入参数/// <summary>/// 配置文件/// </summary>private static IConfiguration? _config;#endregion#region 构造函数/// <summary>/// 构造函数/// </summary>/// <param name="configuration">配置文件</param>public AppSettings(){_config = new ConfigurationBuilder().AddJsonFile("appsettings.json", true, reloadOnChange: true).Build();}#endregion#region 静态方法/// <summary>/// 读取指定节点信息/// </summary>/// <param name="sessions">节点名称</param>/// <returns></returns>public static string ReadString(params string[] sessions){try{if (_config != null && sessions.Any()){string? str = _config[string.Join(":", sessions)];if (!string.IsNullOrEmpty(str)){return str;}}}catch{return string.Empty;}return string.Empty;}/// <summary>/// 读取实体信息/// </summary>/// <param name="sessions">节点名称</param>/// <returns></returns>public static T ReadObject<T>(params string[] sessions) where T : class, new(){T data = new();try{if (_config != null && sessions.Any()){_config.Bind(string.Join(":", sessions), data);}}catch{return data;}return data;}/// <summary>/// 读取实体数组信息/// </summary>/// <param name="sessions">节点名称</param>/// <returns></returns>public static List<T> ReadList<T>(params string[] sessions) where T : class{List<T> list = new();try{if (_config != null && sessions.Any()){_config.Bind(string.Join(":", sessions), list);}}catch{return list;}return list;}#endregion}}
2. 注册服务
public static void Run(this WebApplicationBuilder builder){var logger = NLog.LogManager.Setup().GetCurrentClassLogger();logger.Debug("[启动服务]");try{// 配置文件,放在第一句,并注册为Singletonbuilder.Services.AddSingleton(new AppSettings());// ... 其他}}
3. 使用
修改 appsettings.json 添加测试配置定义 Redis 配置类, 类中属性记得给默认值,避免在使用的时候出现 null 的情况。
/* 单值 */"FileLoad": "/nginx/fileload",/* 对象 */"Redis": {"Enabled": true,"ConnectionString": "127.0.0.1:6379,ssl=false,abortConnect=false,connectTimeout=5000","DatabaseId": 10}
Controller 写测试接口
public class RedisConfig{public bool Enabled { get; set; } = false;public string ConnectionString { get; set; } = "127.0.0.1:6379,ssl=false,abortConnect=false,connectTimeout=5000";public int DatabaseId { get; set; } = 10;}
测试结果:
[HttpGet("read-string")]public string ReadString(string key){string data = AppSettings.ReadString(key);return data;}[HttpGet("read-object")]public RedisConfig ReadObject(string key){RedisConfig data = AppSettings.ReadObject<RedisConfig>(key);return data;}
以上,对 appsettings.json 进行了简单封装。你可以在任何需要获取配置的类中使用 AppSettings。
获取对象[Request URL] http://localhost:5118/WeatherForecast/read-object?key=Redis[Server response]{"enabled": true,"connectionString": "127.0.0.1:6379,ssl=false,abortConnect=false,connectTimeout=5000","databaseId": 10}获取单值[Request URL] http://localhost:5118/WeatherForecast/read-string?key=FileLoad[Server response] /nginx/fileload
