C# (.NET) 应用程序配置:Microsoft.Extensions.Configuration 库完全指南
基于 C# 和 .NET 的现代应用程序需要灵活的设置管理:数据库连接字符串、外部服务 URL、日志记录参数等。Microsoft.Extensions.Configuration 库提供了一个强大且统一的配置管理机制。它支持多种数据源(JSON、XML、环境变量、命令行参数),并允许将它们组合在同一个层次结构中。
库的主要功能
- 多层次合并 — 来自不同源的设置合并为一个统一对象。
- 源优先级 — 最后添加的源会覆盖之前的设置。
- 绑定到类(Options 模式) — 从配置自动填充 POCO 对象。
- 动态更新 — 支持无需重启应用程序即可重新读取文件。
- 安全性 — 敏感数据可移至环境变量或 Azure Key Vault。
基本用法:从 appsettings.json 读取
在项目根目录创建 appsettings.json 文件:
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning" } }, "ConnectionStrings": { "DefaultConnection": "Server=localhost;Database=mydb;User Id=sa;Password=***;" }, "AppSettings": { "AppName": "MyApp", "MaxRetries": 3, "FeatureFlags": { "EnableNewUI": true, "EnableAnalytics": false } }}在代码中加载配置:
using Microsoft.Extensions.Configuration;
var configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .Build();
// 读取简单值string appName = configuration["AppSettings:AppName"];int maxRetries = int.Parse(configuration["AppSettings:MaxRetries"]);
// 读取嵌套节var loggingSection = configuration.GetSection("Logging:LogLevel");string defaultLevel = loggingSection["Default"];
// 读取连接字符串string connString = configuration.GetConnectionString("DefaultConnection");
Console.WriteLine($"应用程序: {appName}, 重试次数: {maxRetries}");源优先级与合并
您可以组合多个源。例如,先加载 JSON,然后通过环境变量覆盖特定参数:
var config = new ConfigurationBuilder() .AddJsonFile("appsettings.json") .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) // 用于 Development/Production .AddEnvironmentVariables() // 环境变量具有更高优先级 .AddCommandLine(args) // 命令行参数具有最高优先级 .Build();绑定到强类型类(Options 模式)
为配置节创建类:
public class AppSettings{ public string AppName { get; set; } public int MaxRetries { get; set; } public FeatureFlags FeatureFlags { get; set; }}
public class FeatureFlags{ public bool EnableNewUI { get; set; } public bool EnableAnalytics { get; set; }}然后在 Program.cs 中使用 DI 容器 进行绑定:
// 注册服务builder.Services.Configure<AppSettings>( builder.Configuration.GetSection("AppSettings"));
// 在类中使用(例如,在控制器中)public class HomeController : Controller{ private readonly AppSettings _settings; public HomeController(IOpti