目录
介绍
在现代软件开发领域,配置管理在确保应用程序的灵活性、可扩展性和可维护性方面发挥着关键作用。Microsoft的.NET生态系统通过IConfiguration接口提供了一个强大的配置框架,允许开发人员访问来自各种来源的配置数据。但是,在处理复杂系统或企业级应用程序时,可能需要针对特定要求量身定制的自定义配置提供程序。
在本文中,我们将探讨利用MS SQL Server存储配置数据的自定义IConfiguration提供程序的实现。此解决方案的优势在于将配置设置集中在数据库中,无需重新启动应用程序即可实现动态更新。
背景
配置提供程序允许开发人员从各种源(例如JSON文件、环境变量和Azure Key Vault)检索配置数据。这些配置源被抽象在统一的API后面。
有用的链接:
Implement a custom configuration provider - .NET | Microsoft Learn
设置项目
出于演示目的,让我们考虑一个空的默认ASP.NET项目。我们将在此项目中实现名为SQLConfigurationProvider的自定义配置提供程序。为了与SQL数据库进行交互,我们将使用Dapper,这是一个适用于.NET的轻量级对象关系映射(ORM)库。
namespace SQLConfigurationProvider;
public class SqlServerConfigurationProvider : ConfigurationProvider, IDisposable
{
private SqlServerConfigurationSource _source { get; }
private readonly Timer? _timer;
public SqlServerConfigurationProvider(SqlServerConfigurationSource source)
{
_source = source;
if (_source.ReloadPeriodically)
{
_timer = new Timer
(
callback: ReloadSettings,
dueTime: TimeSpan.FromSeconds(10),
period: TimeSpan.FromSeconds(_source.PeriodInSeconds),
state: null
);
}
}
public override void Load()
{
using var connection = new SqlConnection(_source.ConnectionString);
//TODO Just a sample of query and set prop
var myConfigurationOnSQL = connection.Query("select * from 1").ToDictionary(x => (string)x.Key, x => (string)x.Value);
Data = myConfigurationOnSQL;
}
private void ReloadSettings(object? state)
{
Load();
OnReload();
}
public void Dispose()
{
_timer?.Dispose();
}
}
重新加载配置数据
可靠的配置提供程序的主要功能之一是能够在不重新启动应用程序的情况下重新加载配置数据。为了使用SQLConfigurationProvider实现这一点,我们实现了一种机制来定期刷新数据库中的配置数据。
结论
在本文中,我们探讨了使用MS SQL Server作为存储后端的自定义IConfiguration提供程序的实现。通过利用Dapper进行数据库交互,我们创建了一个灵活的解决方案,允许动态配置更新,而无需重新启动应用程序。此方法对于具有复杂配置要求的企业级应用程序特别有用。
https://www.codeproject.com/Tips/5379613/Implementing-a-Custom-IConfiguration-Provider-with