You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 22:24:01