加载自定义的配置文件
- 默认情况下,.NET Core 应用程序使用
appsettings.json
文件来存储配置信息,但是有时我们需要加载自定义的配置文件 - .NET Core 提供了
ConfigurationBuilder
类来加载和管理配置信息。ConfigurationBuilder
类允许我们加载多个配置文件,并将它们合并为一个IConfiguration
对象
一、加载 指定的 json配置 (Program.cs)
var builder = WebApplication.CreateBuilder(args);
builder.Host.ConfigureAppConfiguration((hostContext, configurationBuilder) =>
{
//加载 指定的 json配置
configurationBuilder.AddJsonFile("Configuration/Database.json", optional: true, reloadOnChange: true);
});
二、根据配置 自动扫描多个 json配置
- Program.cs
var builder = WebApplication.CreateBuilder(args); builder.Host.ConfigureAppConfiguration((hostContext, configurationBuilder) => { //批量加载多个 json配置 AppConfiguration.AddJsonFiles(configurationBuilder); });
- AppConfiguration.cs
public static class AppConfiguration { /// <summary> /// 排除的配置文件前缀 /// </summary> private static readonly string[] excludeJsonPrefixs = new[] { "appsettings", "bundleconfig", "compilerconfig" }; /// <summary> /// 排除运行时 Json 后缀 /// </summary> private static readonly string[] runtimeJsonSuffixs = new[] { "deps.json", "runtimeconfig.dev.json", "runtimeconfig.prod.json", "runtimeconfig.json", "staticwebassets.runtime.json" }; /// <summary> /// 加载所有的自定义json 配置文件 /// </summary> /// <param name="configurationBuilder"></param> public static void AddJsonFiles(IConfigurationBuilder configurationBuilder) { // 获取根配置 var configuration = configurationBuilder.Build(); // 获取程序执行目录 G:\bin\Debug\net6.0\ var executeDirectory = AppContext.BaseDirectory; // 获取自定义配置扫描目录,并设置完整的路径返回 var configurationScanDirectories = (configuration.GetSection("ConfigurationScanDirectories").Get<string[]>() ?? Array.Empty<string>()).Select(u => Path.Combine(executeDirectory, u)); // 扫描执行目录及自定义配置目录下的 *.json 文件 var jsonFiles = new[] { executeDirectory }.Concat(configurationScanDirectories) .SelectMany(u => Directory.GetFiles(u, "*.json", SearchOption.TopDirectoryOnly)); // 如果没有配置文件,中止执行 if (!jsonFiles.Any()) return; // 将所有文件进行 前缀,后缀的筛选 var files = jsonFiles.Where(file => !excludeJsonPrefixs.Any(c => Path.GetFileName(file).StartsWith(c))).Where(file => !runtimeJsonSuffixs.Any(c => file.EndsWith(c))); // 循环加载 foreach (var jsonFile in files) { configurationBuilder.AddJsonFile(jsonFile, optional: true, reloadOnChange: true); } } }
- appsettings.json
{ "ConfigurationScanDirectories": [ "Configuration", "Configuration3" ]// 扫描配置文件json文件夹(自动合并该文件夹里面所有json文件) } }
- 控制器(DemoController.cs)
/// <summary> /// 获取 所有 Json 配置 信息 /// </summary> /// <param name="configuration"></param> /// <returns></returns> [HttpGet] public Dictionary<string, Dictionary<string, string>> GetJsonConfigurationList([FromServices] IConfiguration configuration) { Dictionary<string, Dictionary<string, string>> kvList = new Dictionary<string, Dictionary<string, string>>(); var configurationRoot = (IConfigurationRoot)configuration; var providersList = configurationRoot.Providers; foreach (var item in providersList) { var typeName = item.GetType().Name; if (item is JsonConfigurationProvider fileProvider) { //通过反射 读取保护属性(Data)属性 var dataField = fileProvider.GetType().GetProperty("Data", BindingFlags.NonPublic | BindingFlags.Instance); var data = (Dictionary<string, string>)dataField.GetValue(fileProvider); var source = fileProvider.Source; kvList.Add(source.Path, data); } } return kvList; } /// <summary> /// 获取configuration中所有的键值对 /// </summary> [HttpGet] public dynamic GetConfigurationList([FromServices] IConfiguration configuration) { var kvList = configuration.AsEnumerable().ToList(); return kvList; }