如何从appsettings.json中加载嵌套的多租户数据库配置字典?
多数据库配置加载问题解答
问题背景
appsettings.json中存储了多套数据库配置,生产环境需对接60+个不同数据库,每个客户对应独立的连接字符串,需要在服务启动/健康检查阶段验证配置有效性,加载方法在ConfigureServices中调用,入参为IConfiguration类型。
现有配置片段
"KommuneConfiguration": { "localhost": { "KommuneNumber": "localhost", "ConnectionString": "Server=H52371;Database=DeliveryReport;Trusted_Connection=True;MultipleActiveResultSets=true", "TableName": "[DeliveryReport].[dbo].[DeliveryReport]" }, "000": { "KommuneNumber": "000", "ConnectionString": "Server=172.31.112.106;Database=000_XXXX_02_EDW;Trusted_Connection=True;MultipleActiveResultSets=true", "TableName": "[000_XXXX_02_EDW].[gateway].[DeliveryReport]" }, "550": { "KommuneNumber": "550", "ConnectionString": "Server=172.31.112.106;Database=550_XXXX_02_EDW;Trusted_Connection=True;MultipleActiveResultSets=true", "TableName": "[550_XXXX_02_EDW].[gateway].[DeliveryReport]" }, "607": { "KommuneNumber": "607", "ConnectionString": "Server=172.31.112.106;Database=607_XXXX_02_EDW;Trusted_Connection=True;MultipleActiveResultSets=true", "TableName": "[607_XXXX_02_EDW].[gateway].[DeliveryReport]" } }
失败方案原因说明
- 第一种方案:
x.Value只能获取字符串类型的配置值,而每个子节点是对象类型,无法直接通过Value获取,因此返回null - 第二种方案:
KommuneSettings类包含名为Settings的属性,但配置中KommuneConfiguration节点下直接是客户编号的键值对,没有对应的Settings层级,因此绑定失败 - 第三种方案:方向正确,通常返回null的原因是未安装
Microsoft.Extensions.Configuration.BinderNuGet包,或是旧版本.NET Core的绑定兼容问题
正确加载方案
方案1:直接绑定到字典(推荐)
首先确认项目已安装Microsoft.Extensions.Configuration.Binder NuGet包,这是强类型配置绑定的依赖包,缺失会导致绑定返回null。
var kommuneConfigs = configuration.GetSection("KommuneConfiguration") .Get<Dictionary<string, KommuneConfiguration>>();
加载后即可通过kommuneConfigs["550"].ConnectionString的方式获取对应客户的数据库配置。
方案2:手动遍历绑定(兼容所有版本)
如果方案1因版本问题不生效,可以手动遍历子节点逐个绑定:
var kommuneConfigs = configuration.GetSection("KommuneConfiguration") .GetChildren() .ToDictionary( section => section.Key, section => section.Get<KommuneConfiguration>() );
适配KommuneSettings类的写法
如果需要保留现有KommuneSettings类,调整绑定逻辑即可:
var hold = new KommuneSettings { Settings = configuration.GetSection("KommuneConfiguration").Get<Dictionary<string, KommuneConfiguration>>() };
内容的提问来源于stack exchange,提问作者Linda Lawton - DaImTo
相关产品推荐
相关产品推荐

