ASP.NET Core中使用ADO.NET实现自定义ConfigurationProvider相关问题咨询
基于ADO.NET实现.NET Core自定义数据库ConfigurationProvider全流程
核心解决思路:配置源加载是按注册顺序执行的,只需先加载本地配置源(appsettings.json、环境变量等)拿到数据库连接串,再注册自定义的ADO.NET配置源即可,无需等待Startup类的配置逻辑执行。
步骤1:实现自定义ConfigurationProvider
直接继承ConfigurationProvider类,重写Load方法实现数据库配置读取逻辑,可直接复用你已搭建好的数据读取层:
using Microsoft.Extensions.Configuration; using System.Data.SqlClient; public class AdoNetConfigurationProvider : ConfigurationProvider { private readonly string _dbConnectionString; // 构造函数传入数据库连接串 public AdoNetConfigurationProvider(string dbConnectionString) { _dbConnectionString = dbConnectionString; } // 重写Load方法从数据库拉取键值对配置 public override void Load() { var configData = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); // 下方可替换为你自己的现有数据读取层逻辑 using var conn = new SqlConnection(_dbConnectionString); conn.Open(); using var cmd = new SqlCommand("SELECT ConfigKey, ConfigValue FROM 你的全局配置表名", conn); using var reader = cmd.ExecuteReader(); while (reader.Read()) { var key = reader.GetString(0).Trim(); var value = reader.IsDBNull(1) ? string.Empty : reader.GetString(1).Trim(); configData[key] = value; } // 赋值给父类Data属性,.NET配置系统可直接识别读取 Data = configData; } }
步骤2:实现自定义ConfigurationSource
实现IConfigurationSource接口,用于创建对应的ConfigurationProvider实例:
using Microsoft.Extensions.Configuration; public class AdoNetConfigurationSource : IConfigurationSource { public string ConnectionString { get; set; } public IConfigurationProvider Build(IConfigurationBuilder builder) { return new AdoNetConfigurationProvider(ConnectionString); } }
步骤3:在启动代码中注册配置源(解决连接串获取问题)
.NET 6+ 顶级语句Program.cs写法
var builder = WebApplication.CreateBuilder(args); // 直接从已默认加载的本地配置中读取数据库连接串 // 默认已加载appsettings.json、appsettings.{环境名}.json、环境变量、命令行参数等配置 var configDbConn = builder.Configuration.GetConnectionString("你的配置库连接串名"); // 注册自定义ADO.NET配置源 builder.Configuration.Add(new AdoNetConfigurationSource { ConnectionString = configDbConn }); // 后续配置Options、注册服务都可直接读取数据库中的配置 // 示例:绑定到强类型Options builder.Services.Configure<你的全局Options类>(builder.Configuration.GetSection("对应配置键前缀")); // 其他服务注册逻辑... var app = builder.Build(); // 中间件配置逻辑... app.Run();
.NET 5及更早版本写法
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((context, config) => { // 先构建已注册的本地配置,拿到数据库连接串 var builtConfig = config.Build(); var configDbConn = builtConfig.GetConnectionString("你的配置库连接串名"); // 注册自定义ADO.NET配置源 config.Add(new AdoNetConfigurationSource { ConnectionString = configDbConn }); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
注意事项
- 数据库配置键支持冒号分隔层级,比如键名为
GlobalSettings:UploadLimit可直接绑定到GlobalSettings类的UploadLimit属性 - 如果需要配置热更新,可在
AdoNetConfigurationProvider中增加定时轮询数据库的逻辑,更新Data属性后调用OnReload()方法即可触发配置刷新 - 配置库连接串必须存储在本地配置源(appsettings.json、环境变量、密钥管理器等)中,禁止硬编码到业务代码
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

