将依赖项传递给 .NET 6 中的 program.cs 中的 app.[Methods()]

Has*_*ood 2 c# asp.net asp.net-core asp.net-core-webapi .net-6.0

在.NET 5及之前的版本中,我们曾经有一个startup.cs文件,里面有ConfigureServices和Configure Method。在下面的函数中,我添加了 ILoggerManager 作为函数的参数,然后将其传递给 app.ConfigureExceptionHandler 函数。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerManager logger) 
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.ConfigureExceptionHandler(logger);
    app.UseHttpsRedirection();
    app.UseRouting();
    app.UseAuthorization();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}
Run Code Online (Sandbox Code Playgroud)

但对于.NET 6,没有startup.cs 文件,只有program.cs 文件。program.cs 中没有ConfigureService 或Configure 方法,并且所有方法或函数都以过程方式调用,没有任何类或方法声明,如下所示:

var builder = WebApplication.CreateBuilder(args);
var logger = new LoggerManager();

builder.Services.AddControllers();
builder.Services.AddDbContext<DocumentDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DocumentStore")));
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddSingleton<ILoggerManager, LoggerManager>();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.ConfigureExceptionHandler(<how to pass dependency here>);

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
Run Code Online (Sandbox Code Playgroud)

我的问题是如何将依赖项传递给 .NET 6 中的 app.ConfigureExceptionHandler() 函数。我找不到任何相关文档。

Gur*_*ron 6

由于您正在创建LoggerManager自己 ( var logger = new LoggerManager();),因此您可以简单地执行以下操作:

app.ConfigureExceptionHandler(logger);
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢使用 DI,您可以利用IServiceProvider公开的WebApplication.Services属性:

var resolvedLoggerManager = app.Services.GetRequiredService<ILoggerManager>();
app.ConfigureExceptionHandler(resolvedLoggerManager);
Run Code Online (Sandbox Code Playgroud)