ASP.NET Core 6+ 中访问配置的完整指南
版本说明
本文内容适用于 .NET 6、.NET 7 和 .NET 8 版本
问题概述
在 ASP.NET Core 6 之前的版本中,开发人员通过 Startup.cs
类来配置应用程序,可以轻松注入 IConfiguration
和 IHostEnvironment
等对象。但在 .NET 6 及更高版本中,Microsoft 引入了简化后的模板,移除了 Startup.cs
文件,将配置和中间件设置都集中在 Program.cs
中。
很多开发者因此不知道如何在新的模板中访问配置信息,特别是在需要读取 appsettings.json
文件或环境变量时。
解决方案
1. 使用 WebApplicationBuilder 访问配置
WebApplication.CreateBuilder(args)
返回的 WebApplicationBuilder
对象提供了直接访问配置和环境信息的方式:
var builder = WebApplication.CreateBuilder(args);
// 访问配置对象
ConfigurationManager configuration = builder.Configuration;
// 访问环境信息
IWebHostEnvironment environment = builder.Environment;
// 使用配置信息
builder.Services.AddDbContext<FestifyContext>(opt =>
opt.UseSqlServer(builder.Configuration.GetConnectionString("Festify")));
2. 使用 WebApplication 访问配置
构建应用后,也可以通过 WebApplication
实例访问配置:
var app = builder.Build();
// 构建后访问配置
IConfiguration configuration = app.Configuration;
IWebHostEnvironment environment = app.Environment;
3. 配置特定设置类
对于复杂的配置结构,推荐使用强类型配置类:
// appsettings.json
{
"ConnectionStrings": {
"Festify": "YourConnectionString"
},
"AppSettings": {
"Token": "your-token-value"
}
}
// 配置类
public class AppSettings
{
public string Token { get; set; }
}
// Program.cs 中注册配置
builder.Services.Configure<AppSettings>(
builder.Configuration.GetSection("AppSettings"));
// 在控制器或服务中注入使用
public class MyService
{
private readonly AppSettings _appSettings;
public MyService(IOptions<AppSettings> appSettings)
{
_appSettings = appSettings.Value;
}
public void UseToken()
{
var token = _appSettings.Token;
// 使用 token
}
}
4. 访问连接字符串
// 直接访问连接字符串
string connectionString = builder.Configuration.GetConnectionString("Festify");
// 在 DbContext 中使用
builder.Services.AddDbContext<FestifyContext>(options =>
options.UseSqlServer(connectionString));
5. 多环境配置
// 根据不同环境加载不同的配置文件
var builder = WebApplication.CreateBuilder(args);
// 自动加载 appsettings.json 和 appsettings.{Environment}.json
// 环境变量优先级最高
{
"ConnectionStrings": {
"Festify": "Server=localhost;Database=DevDB;Trusted_Connection=true;"
}
}
{
"ConnectionStrings": {
"Festify": "Server=prod-server;Database=ProdDB;User Id=user;Password=pass;"
}
}
6. Worker Service 的特殊情况
对于 Worker Service(非 Web 应用),配置访问方式略有不同:
IHost host = Host.CreateDefaultBuilder(args)
.ConfigureServices((context, services) =>
{
// 通过 context.Configuration 访问配置
var settings = context.Configuration.GetSection("AppSettings").Get<AppSettings>();
})
.Build();
最佳实践
- 使用强类型配置:创建配置类并使用
GetSection()
和Get<T>()
方法 - 遵循环境约定:利用
appsettings.{Environment}.json
文件管理不同环境的配置 - 安全存储敏感信息:使用用户机密(开发时)或 Azure Key Vault/AWS Secrets Manager(生产环境)
- 避免硬编码配置路径:使用配置系统而不是直接访问特定文件
常见问题
注意事项
- 确保配置键名与 JSON 文件中的路径完全匹配(区分大小写)
- 环境特定的配置文件会自动基于
IHostEnvironment.EnvironmentName
加载 - 环境变量的优先级高于配置文件中的设置
总结
在 ASP.NET Core 6+ 中,通过 WebApplicationBuilder.Configuration
属性可以轻松访问配置信息。新的编程模型虽然移除了 Startup.cs
,但提供了更简洁直观的方式来配置应用程序和服务。
var builder = WebApplication.CreateBuilder(args);
// 访问配置和环境信息
var configuration = builder.Configuration;
var environment = builder.Environment;
// 使用配置注册服务
builder.Services.AddDbContext<FestifyContext>(options =>
options.UseSqlServer(configuration.GetConnectionString("Festify")));
var app = builder.Build();
// 应用配置和中间件
app.Run();
这种新的模式减少了模板代码,使应用程序的启动配置更加简洁和直观。