ASP.NET Core 7中如何通过WebApplication获取HostBuilderContext
在ASP.NET Core 7顶级语句中获取HostingEnvironment并注册配置服务
在ASP.NET Core 7的顶级语句模式下,有两种简洁方式可以获取HostingEnvironment并完成配置服务的注册,同时满足你添加DbContext的需求:
方法一:通过builder.Host.ConfigureServices获取HostBuilderContext
WebApplicationBuilder的Host属性支持调用ConfigureServices方法,这里可以直接拿到HostBuilderContext,和你之前使用Host.CreateDefaultBuilder的写法逻辑一致:
var builder = WebApplication.CreateBuilder(args); // 借助Host.ConfigureServices获取HostBuilderContext builder.Host.ConfigureServices((hostBuilderContext, services) => { var env = hostBuilderContext.HostingEnvironment; // 注册对应环境的配置文件 services.RegisterAppSettings<Config>($"appsettings.{env.EnvironmentName}.json"); }); // 添加DbContext(此时IDatabaseConfig已注册到DI容器) builder.Services.AddDbContext<EntityDbContext>((provider, options) => { var dbCfg = provider.GetRequiredService<IDatabaseConfig>(); options.UseSqlServer(dbCfg); }); // 其他基础服务注册 builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); // 中间件配置 app.UseSwagger(); app.UseSwaggerUI(); app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
方法二:直接使用builder.Environment获取HostingEnvironment
WebApplicationBuilder本身自带Environment属性,无需通过HostBuilderContext,写法更直接:
var builder = WebApplication.CreateBuilder(args); // 直接从builder实例获取环境信息 var env = builder.Environment; builder.Services.RegisterAppSettings<Config>($"appsettings.{env.EnvironmentName}.json"); // 添加DbContext builder.Services.AddDbContext<EntityDbContext>((provider, options) => { var dbCfg = provider.GetRequiredService<IDatabaseConfig>(); options.UseSqlServer(dbCfg); }); // 其他基础服务注册 builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); // 中间件配置 app.UseSwagger(); app.UseSwaggerUI(); app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
注意事项
- 两种方法均可满足需求:方法一适合需要访问HostBuilderContext其他属性(如Configuration)的场景;方法二更简洁,适合仅需获取环境信息的场景。
- 务必确保
IDatabaseConfig的注册代码在添加DbContext之前执行,保证DI容器能正确解析出对应实例。
内容的提问来源于stack exchange,提问作者Stephen York
相关产品推荐
相关产品推荐

