从数据库或DB数据填充对象加载ConfigurationManager可行吗?
当然可以从数据库加载配置到ConfigurationManager!
这在.NET Framework环境下完全可行,核心思路是自定义配置提供程序——默认的ConfigurationManager依赖本地配置文件(比如web.config),但我们可以利用它的扩展能力,让它从数据库读取并加载配置数据。
下面是具体的实现步骤和示例:
1. 实现自定义配置提供程序
首先创建一个继承自ConfigurationProvider的类,重写Load方法,在这个方法里完成从数据库读取键值对并填充到配置字典的逻辑:
using System.Configuration; using System.Data.SqlClient; public class DbConfigurationProvider : ConfigurationProvider { // 连接配置数据库的基础连接字符串(建议从环境变量、本地安全配置获取,避免循环依赖) private readonly string _dbConnectionString; public DbConfigurationProvider(string connectionString) { _dbConnectionString = connectionString; } public override void Load() { Data.Clear(); // 清空现有配置缓存 using (var conn = new SqlConnection(_dbConnectionString)) { conn.Open(); // 假设你的数据库表结构为:Id, ConfigKey, ConfigValue, ConfigType(区分AppSetting/ConnectionString) var cmd = new SqlCommand("SELECT ConfigKey, ConfigValue, ConfigType FROM AppConfigurations", conn); var reader = cmd.ExecuteReader(); while (reader.Read()) { var key = reader["ConfigKey"].ToString(); var value = reader["ConfigValue"].ToString(); var type = reader["ConfigType"].ToString(); // 模拟web.config的层级结构,区分AppSettings和ConnectionStrings var fullKey = type.Equals("ConnectionString", StringComparison.OrdinalIgnoreCase) ? $"connectionStrings/{key}" : $"appSettings/{key}"; Data[fullKey] = value; } } } }
2. 注册自定义提供程序到web.config
接下来需要告诉ConfigurationManager使用我们的自定义提供程序,修改web.config文件:
<configuration> <configSections> <!-- 注册自定义配置节 --> <section name="dbConfiguration" type="YourNamespace.DbConfigurationSection, YourAssembly" /> </configSections> <!-- 配置连接数据库的初始字符串(不能存在于待读取的数据库中,避免循环依赖) --> <connectionStrings> <add name="ConfigDbConnection" connectionString="Server=.;Database=YourConfigDb;Integrated Security=True" /> </connectionStrings> <!-- 注册自定义配置提供程序 --> <dbConfiguration> <providers> <add name="DbConfigProvider" type="YourNamespace.DbConfigurationProvider, YourAssembly" connectionStringName="ConfigDbConnection" /> </providers> </dbConfiguration> </configuration>
3. 像普通配置一样读取数据
完成上述步骤后,你就可以和使用原生web.config一样,通过ConfigurationManager读取数据库中的配置了:
// 读取AppSetting项 var apiKey = ConfigurationManager.AppSettings["ApiKey"]; // 读取ConnectionString项 var mainDbConn = ConfigurationManager.ConnectionStrings["MainDb"].ConnectionString;
关键注意事项
- 避免循环依赖:连接配置数据库的初始字符串不能存储在目标数据库中,建议放在web.config、环境变量或者安全存储服务中。
- 配置刷新:如果需要实时感知数据库中的配置变更,可以在自定义提供程序中实现
Refresh方法,或者定时调用Load方法重新拉取数据。 - 性能优化:可以给数据库读取的配置添加本地缓存,减少数据库访问次数,同时在配置变更时主动失效缓存。
内容的提问来源于stack exchange,提问作者Justin Homes
相关产品推荐
相关产品推荐

