.NET5升级.NET6无Startup.cs时IConfiguration配置实现方法
核心原因
.NET 6 起默认采用最小托管模型,不再强制要求使用Startup.cs拆分配置逻辑,原Startup类承担的服务注册、中间件管道配置职责,全部可以直接在Program.cs通过顶级语句实现。
现有代码无法正常运行的错误点:
- 服务注册位置错误:
AddDbContext属于服务注入配置,必须在var app = builder.Build()调用前执行。Build()方法执行完成后会生成只读的服务提供器,后续无法再注册新服务,运行时会直接抛出InvalidOperationException。 - 冗余配置取值:服务注册阶段直接通过
builder.Configuration就能读取配置,不需要等应用构建完成后从app.Configuration取值,也不需要额外声明全局变量存储配置实例。
修正后的可直接运行代码
using API.Data; using Microsoft.EntityFrameworkCore; var builder = WebApplication.CreateBuilder(args); // 所有服务注册逻辑统一放在Build()调用前 builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); // 直接读取builder.Configuration中的连接字符串注册DbContext builder.Services.AddDbContext<DataContext>(options => { options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")); }); var app = builder.Build(); // 所有中间件管道配置逻辑统一放在Build()调用后 if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
可选:兼容原有Startup类的写法
如果是老项目迁移,想保留原Startup类的结构减少改动量,也可以手动添加Startup类,在Program.cs中手动调用对应方法即可,不需要依赖框架自动注入。
- 手动创建
Startup.cs写入原有逻辑
public class Startup { private readonly IConfiguration _config; public Startup(IConfiguration config) { _config = config; } public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddEndpointsApiExplorer(); services.AddSwaggerGen(); services.AddDbContext<DataContext>(options => { options.UseSqlServer(_config.GetConnectionString("DefaultConnection")); }); } public void Configure(WebApplication app) { if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); } }
- 简化
Program.cs逻辑调用Startup
var builder = WebApplication.CreateBuilder(args); var startup = new Startup(builder.Configuration); startup.ConfigureServices(builder.Services); var app = builder.Build(); startup.Configure(app); app.Run();
注意:该兼容写法仅适合老项目快速迁移适配,新项目直接使用最小托管模型写法更简洁,也是官方推荐的默认方式。
内容的提问来源于stack exchange,提问作者Ahsan Khan
相关产品推荐
相关产品推荐

