.NET 6的Program.cs中如何向app.ConfigureExceptionHandler传递依赖
解决.NET 6 Program.cs中向ConfigureExceptionHandler传递依赖的方法
.NET 6的顶级语句模式下,WebApplication实例的Services属性对应全局服务容器,你可以直接从中解析已注册的依赖,替代之前Startup类中Configure方法的参数注入逻辑,以下是适配不同场景的实现方案:
场景1:适配你当前已提前实例化LoggerManager的代码
你现有代码中已经手动创建了LoggerManager实例,直接复用即可,只需要调整服务注册逻辑绑定该实例,后续直接传参:
var builder = WebApplication.CreateBuilder(args); var logger = new LoggerManager(); // 调整注册逻辑,绑定你已经创建的实例作为单例 builder.Services.AddSingleton<ILoggerManager>(logger); builder.Services.AddControllers(); builder.Services.AddDbContext<DocumentDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DocumentStore"))); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); // 配置HTTP请求管道 if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } // 直接传入你已经创建的logger实例即可 app.ConfigureExceptionHandler(logger); app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
场景2:依赖为Singleton注册类型
如果依赖是注册为单例的,不需要提前手动实例化,直接从根服务容器解析即可:
// 服务注册阶段你已经完成注册:builder.Services.AddSingleton<ILoggerManager, LoggerManager>(); var app = builder.Build(); // 其余管道配置不变... app.ConfigureExceptionHandler(app.Services.GetRequiredService<ILoggerManager>());
场景3:依赖为Scoped/Transient注册类型
如果你的依赖是作用域或者瞬时类型,不要直接从根服务容器解析,会导致依赖生命周期异常,需要手动创建作用域解析:
var app = builder.Build(); // 其余管道配置不变... using var scope = app.Services.CreateScope(); var logger = scope.ServiceProvider.GetRequiredService<ILoggerManager>(); app.ConfigureExceptionHandler(logger);
内容的提问来源于stack exchange,提问作者Hassaan Masood
相关产品推荐
相关产品推荐

