.NET Program类动态加载指定文件夹下所有JSON配置文件方法
.NET 批量加载指定目录下所有JSON配置的实现方案
可以直接实现,.NET 原生配置构建管线不需要提前硬编码每个JSON配置的文件名,完全适配多租户单配置文件、低停机时间的需求。
核心实现逻辑
配置构建器支持链式追加多个JSON配置源,你只需要在初始化WebApplicationBuilder阶段,遍历目标文件夹下所有后缀为.json的文件,逐个将文件加入配置源列表即可,配合文件变更重载能力,新增/修改单个租户配置完全不需要重启服务。
.NET 6+ 顶层语句模式下的Program.cs实现代码如下:
var builder = WebApplication.CreateBuilder(args); // 从基础配置中读取租户配置存放的根目录路径,可提前配置在默认appsettings.json中 var tenantConfigDir = builder.Configuration.GetValue<string>("TenantConfigDirectory"); // 目录不存在时自动创建,避免首次启动路径报错 if (!Directory.Exists(tenantConfigDir)) { Directory.CreateDirectory(tenantConfigDir); } // 遍历目录下所有JSON文件,按文件名排序后加载(可根据业务调整排序规则控制配置优先级) var tenantConfigFiles = Directory.GetFiles(tenantConfigDir, "*.json", SearchOption.TopDirectoryOnly) .OrderBy(path => Path.GetFileName(path)) .ToList(); foreach (var configFile in tenantConfigFiles) { builder.Host.ConfigureAppConfiguration((_, configBuilder) => { configBuilder.AddJsonFile( path: configFile, optional: false, reloadOnChange: true // 开启文件变更自动重载,修改/新增配置无需重启服务 ); }); } // 后续服务注册、中间件配置逻辑保持原有写法即可 // builder.Services.AddControllers(); // ... 其他业务逻辑 var app = builder.Build(); // ... 中间件配置 app.Run();
关键注意点
- 配置优先级规则:后加载的配置项会覆盖之前加载的同层级同键名配置,你可以通过调整文件遍历的排序规则,自定义不同租户配置、公共配置的优先级。
- 故障隔离效果:单个租户JSON文件存在格式错误、字段缺失时,只会导致该次对应文件的重载失败,不会影响其他租户的正常配置加载,从根本上避免单配置文件写错导致全量租户不可用的问题。你可以通过监听
AppConfiguration的重载异常事件打印错误日志,快速定位出错的配置文件。 - 多文件性能表现:.NET配置系统启动时会一次性将所有配置文件内容构建为内存中的键值树,后续读取配置都是内存操作,即使目录下存在数百个租户配置文件,启动加载耗时和运行时读取性能都不会有明显问题。
- 零停机更新:开启
reloadOnChange后,新增租户只需要将对应配置文件放入指定目录,配置系统会在几百毫秒内自动完成重载,不需要重启应用、不需要回收应用池,完全满足低停机时间的要求。 - 如果需要按租户分二级/三级目录存放配置,只需要将
Directory.GetFiles的SearchOption参数改为SearchOption.AllDirectories即可自动遍历所有子目录的JSON文件。
内容的提问来源于stack exchange,提问作者albe
相关产品推荐
相关产品推荐

