You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 03:27:03