一、配置系统核心概念

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-secrets

    dotnet 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密钥
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐