ASP.NET Core中通过实现IConfigurationProvider和IConfigurationSource接口创建自定义配置提供程序,如从数据库加载配置,并可在Load方法中处理错误、使用重试策略,结合IOptionsMonitor实现配置自动刷新,通过加密工具保护敏感数据,且支持多提供程序按注册顺序决定优先级。

ASP.NET Core中的配置提供程序负责从各种来源加载配置数据,并将其提供给应用程序使用。它们允许你从如appsettings.json、环境变量、命令行参数甚至自定义来源读取配置。自定义配置提供程序则意味着你可以编写自己的代码来加载配置,例如从数据库或加密文件中读取。
解决方案
ASP.NET Core使用
IConfigurationProvider
JsonConfigurationProvider
EnvironmentVariablesConfigurationProvider
CommandLineConfigurationProvider
XmlConfigurationProvider
IniConfigurationProvider
要自定义配置提供程序,你需要:
IConfigurationProvider
IConfigurationSource
ConfigureAppConfiguration
IConfigurationBuilder
下面是一个简单的示例,演示如何创建一个从数据库读取配置的自定义配置提供程序。
// 1. 定义配置源
public class DatabaseConfigurationSource : IConfigurationSource
{
private readonly string _connectionString;
public DatabaseConfigurationSource(string connectionString)
{
_connectionString = connectionString;
}
public IConfigurationProvider Build(IConfigurationBuilder builder)
{
return new DatabaseConfigurationProvider(_connectionString);
}
}
// 2. 定义配置提供程序
public class DatabaseConfigurationProvider : ConfigurationProvider
{
private readonly string _connectionString;
public DatabaseConfigurationProvider(string connectionString)
{
_connectionString = connectionString;
}
public override void Load()
{
// 模拟从数据库读取配置
var data = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
// 假设有一个Config表,包含Key和Value两列
// 这里直接硬编码模拟数据,实际情况需要连接数据库并读取
data["Setting1"] = "ValueFromDatabase1";
data["Setting2"] = "ValueFromDatabase2";
Data = data;
}
}
// 3. 定义扩展方法,方便注册配置源
public static class DatabaseConfigurationExtensions
{
public static IConfigurationBuilder AddDatabaseConfiguration(this IConfigurationBuilder builder, string connectionString)
{
builder.Add(new DatabaseConfigurationSource(connectionString));
return builder;
}
}
// 4. 在Startup.cs (或 Program.cs in .NET 6+) 中注册配置源
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
// ...
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// ...
}
public void ConfigureAppConfiguration(HostBuilderContext context, IConfigurationBuilder builder)
{
builder.AddDatabaseConfiguration("YourConnectionString"); // 替换为你的数据库连接字符串
}
}
// 或者在.NET 6+ 中 Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Configuration.AddDatabaseConfiguration("YourConnectionString");
在这个例子中,
DatabaseConfigurationProvider
Load
Data
Data
Dictionary<string, string>
副标题1
如何处理配置提供程序中的错误?
处理配置提供程序中的错误至关重要,以防止应用程序在启动时崩溃或出现意外行为。 在
Load()
try-catch
public override void Load()
{
try
{
// 模拟从数据库读取配置
var data = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
// 假设有一个Config表,包含Key和Value两列
// 这里直接硬编码模拟数据,实际情况需要连接数据库并读取
// 实际情况需要连接数据库并读取
data["Setting1"] = "ValueFromDatabase1";
data["Setting2"] = "ValueFromDatabase2";
Data = data;
}
catch (Exception ex)
{
// 记录错误信息
Console.WriteLine($"Failed to load configuration from database: {ex.Message}");
// 或者抛出自定义异常
throw new ConfigurationException("Failed to load configuration from database.", ex);
}
}更进一步,你可以考虑使用重试策略来处理临时性错误,例如网络连接中断。 Polly 库提供了一种方便的方式来实现重试策略。
副标题2
如何实现配置的自动刷新?
ASP.NET Core 允许你在配置更改时自动刷新配置。 这对于需要在运行时更新配置而无需重启应用程序的场景非常有用。 要实现配置的自动刷新,你需要:
AddJsonFile
ConfigureServices
IOptionsSnapshot<T>
IOptionsMonitor<T>
// 1. 注册配置
public void ConfigureServices(IServiceCollection services)
{
services.Configure<MyConfig>(Configuration.GetSection("MyConfig"));
}
// 2. 使用IOptionsMonitor或IOptionsSnapshot
public class MyService
{
private readonly IOptionsMonitor<MyConfig> _configMonitor;
public MyService(IOptionsMonitor<MyConfig> configMonitor)
{
_configMonitor = configMonitor;
}
public void DoSomething()
{
// 获取最新的配置
var config = _configMonitor.CurrentValue;
Console.WriteLine($"Setting1: {config.Setting1}");
}
}
// 定义配置类
public class MyConfig
{
public string Setting1 { get; set; }
public int Setting2 { get; set; }
}IOptionsMonitor<T>
IOptionsSnapshot<T>
副标题3
如何对配置进行加密和解密?
对配置进行加密可以保护敏感信息,例如数据库连接字符串或 API 密钥。 可以使用
DataProtectionProvider
using Microsoft.AspNetCore.DataProtection;
using System.Security.Cryptography;
using System.Text;
public static class EncryptionHelper
{
public static string EncryptString(string plainText, string key)
{
byte[] iv = new byte[16];
byte[] array;
using (Aes aes = Aes.Create())
{
aes.Key = Encoding.UTF8.GetBytes(key);
aes.IV = iv;
ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
using (MemoryStream memoryStream = new MemoryStream())
{
using (CryptoStream cryptoStream = new CryptoStream((Stream)memoryStream, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter streamWriter = new StreamWriter((Stream)cryptoStream))
{
streamWriter.Write(plainText);
}
array = memoryStream.ToArray();
}
}
}
return Convert.ToBase64String(array);
}
public static string DecryptString(string cipherText, string key)
{
byte[] iv = new byte[16];
byte[] buffer = Convert.FromBase64String(cipherText);
using (Aes aes = Aes.Create())
{
aes.Key = Encoding.UTF8.GetBytes(key);
aes.IV = iv;
ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
using (MemoryStream memoryStream = new MemoryStream(buffer))
{
using (CryptoStream cryptoStream = new CryptoStream((Stream)memoryStream, decryptor, CryptoStreamMode.Read))
{
using (StreamReader streamReader = new StreamReader((Stream)cryptoStream))
{
return streamReader.ReadToEnd();
}
}
}
}
}
}
// 使用示例
string key = "YourSecretKey"; // 务必使用强密钥
string plainText = "SensitiveData";
string encryptedText = EncryptionHelper.EncryptString(plainText, key);
string decryptedText = EncryptionHelper.DecryptString(encryptedText, key);
Console.WriteLine($"Plain Text: {plainText}");
Console.WriteLine($"Encrypted Text: {encryptedText}");
Console.WriteLine($"Decrypted Text: {decryptedText}");请注意,密钥管理至关重要。 不要将密钥存储在源代码或配置文件中。 可以使用 Azure Key Vault 或其他密钥管理服务来安全地存储和管理密钥。 同时,要确保密钥的安全性,避免泄露。
副标题4
如何使用多个配置提供程序并设置优先级?
ASP.NET Core 允许你使用多个配置提供程序,并设置它们的优先级。 配置提供程序的优先级决定了当多个提供程序包含相同配置键时,哪个提供程序的值将被使用。 配置提供程序按照它们添加到
IConfigurationBuilder
public void ConfigureAppConfiguration(HostBuilderContext context, IConfigurationBuilder builder)
{
builder.Sources.Clear(); // 清除默认的配置源
builder.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
builder.AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true);
builder.AddEnvironmentVariables();
builder.AddCommandLine(Environment.GetCommandLineArgs());
builder.AddDatabaseConfiguration("YourConnectionString"); // 数据库配置优先级最高
}在这个例子中,
DatabaseConfigurationProvider
IConfigurationBuilder
appsettings.json
以上就是ASP.NET Core中的配置提供程序是什么?如何自定义?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号