netcore配置系统(JSON/环境变量)
·
一、配置系统核心概念
1. 配置源类型
-
文件配置:JSON、XML、INI等
-
环境变量:操作系统或容器环境变量
-
命令行参数:启动时传入的参数
-
内存配置:临时内存键值对
-
用户Secrets:开发环境敏感数据
-
Azure Key Vault:云端密钥管理
2. 优先级顺序
配置按添加顺序加载,后添加的配置源优先级更高,覆盖之前的相同键值:
命令行参数 > 环境变量 > User Secrets > appsettings.{Environment}.json > appsettings.json
二、基础配置实现
1. JSON文件配置
步骤1:创建appsettings.json
{
"Database": {
"ConnectionString": "Server=localhost;Database=TestDB",
"Timeout": 30
},
"LogLevel": "Information"
}
步骤2:加载配置
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
var connStr = config["Database:ConnectionString"];
var timeout = config.GetValue<int>("Database:Timeout");
2. 环境变量配置
设置环境变量(bash):
export Database__ConnectionString="Server=prod;Database=ProdDB"
export LogLevel=Debug
代码读取:
var config = new ConfigurationBuilder()
.AddEnvironmentVariables()
.Build();
var logLevel = config["LogLevel"]; // 输出Debug
三、多环境配置
1. 环境特定JSON文件
-
appsettings.Development.json -
appsettings.Production.json
加载方式:
var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{env}.json", optional: true)
.Build();
2. 设置环境变量
开发环境(launchSettings.json):
{
"profiles": {
"Development": {
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
生产环境(Docker):
dockerfile
ENV ASPNETCORE_ENVIRONMENT=Production
四、配置绑定与强类型访问
1. 定义配置类
public class DatabaseConfig {
public string ConnectionString { get; set; }
public int Timeout { get; set; }
}
public class AppConfig {
public DatabaseConfig Database { get; set; }
public string LogLevel { get; set; }
}
2. 绑定配置到对象
Startup.cs:
public void ConfigureServices(IServiceCollection services) {
services.Configure<AppConfig>(Configuration);
}
控制器注入使用:
public class HomeController : Controller {
private readonly AppConfig _config;
public HomeController(IOptions<AppConfig> configOptions) {
_config = configOptions.Value;
}
}
五、高级配置技巧
1. 配置实时重载
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
2. 环境变量命名规范
-
分层键转换:使用双下划线
__替代JSON的冒号:# 对应JSON的 Database:ConnectionString export Database__ConnectionString="..."
3. 自定义配置提供程序
public class MyCustomConfigProvider : ConfigurationProvider {
public override void Load() {
Data["CustomKey"] = "ValueFromCustomSource";
}
}
// 注册
var config = new ConfigurationBuilder()
.Add(new MyCustomConfigSource())
.Build();
六、安全最佳实践
1. 敏感数据保护
-
开发环境:使用
dotnet user-secretsdotnet user-secrets set "Database:Password" "P@ssw0rd" -
生产环境:使用Azure Key Vault
.AddAzureKeyVault("https://{vault-name}.vault.azure.net/")
2. 配置验证
services.AddOptions<AppConfig>()
.Bind(Configuration)
.ValidateDataAnnotations();
七、实战场景示例
1. 动态数据库切换
var dbConfig = Configuration.GetSection("Databases:Secondary").Get<DatabaseConfig>();
services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(dbConfig.ConnectionString));
2. 功能开关控制
appsettings.json:
{
"FeatureFlags": {
"EnableNewUI": true,
"MaxItems": 100
}
}
代码使用:
if (config.GetValue<bool>("FeatureFlags:EnableNewUI")) {
// 启用新UI逻辑
}
配置系统架构总结
| 组件 | 作用 | 典型场景 |
|---|---|---|
| IConfiguration | 统一配置访问接口 | 读取键值 |
| ConfigurationBuilder | 构建配置系统 | 组合多个配置源 |
| IOptions<T> | 强类型配置访问 | 注入配置类到服务 |
| 环境变量 | 覆盖默认配置(容器化部署) | Kubernetes环境配置 |
| User Secrets | 本地开发敏感数据存储 | 数据库密码、API密钥 |
更多推荐
所有评论(0)