将依赖项传递给 app.[Methods()] in program.cs in .NET 6
Pass dependency to app.[Methods()] in program.cs in .NET 6
在 .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();
});
}
但是 .Net 6 没有 startup.cs 文件,只有 program.cs 文件。 program.cs 中没有 ConfigureService 或 Configure 方法,所有方法或函数都以过程方式调用,没有任何 class 或方法声明,如下所示:
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();
我的问题是如何将依赖项传递给 .Net 6 中的 app.ConfigureExceptionHandler() 函数。我找不到任何相关文档。
由于您是自己创建 LoggerManager
(var logger = new LoggerManager();
),您可以简单地执行以下操作:
app.ConfigureExceptionHandler(logger);
如果您更喜欢使用 DI,您可以利用 IServiceProvider
通过 WebApplication.Services
属性:
公开
var resolvedLoggerManager = app.Services.GetRequiredService<ILoggerManager>();
app.ConfigureExceptionHandler(resolvedLoggerManager);
对于在调用 builder.Build()
之前尝试获取依赖项的任何人(例如,用于服务设置),您可以使用中间 WebApplicationBuilder 来构建一个额外的 WebApplication 实例,如下所示(请注意,您不能调用 builder.Build()
两次,因此需要中间生成器)。
var builder = WebApplication.CreateBuilder(args);
// Use intermediate builder to obtain configuration etc
var intermediateBuilder = WebApplication.CreateBuilder(args);
var intermediateApp = intermediateBuilder.Build();
// Add services to the container.
var webHostEnvironment = intermediateApp.Services.GetRequiredService<IWebHostEnvironment>();
var configuration = new ConfigurationBuilder()
.AddJsonFile($"appsettings.{webHostEnvironment.EnvironmentName}.json", optional: false, reloadOnChange: false)
.Build();
...
在 .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();
});
}
但是 .Net 6 没有 startup.cs 文件,只有 program.cs 文件。 program.cs 中没有 ConfigureService 或 Configure 方法,所有方法或函数都以过程方式调用,没有任何 class 或方法声明,如下所示:
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();
我的问题是如何将依赖项传递给 .Net 6 中的 app.ConfigureExceptionHandler() 函数。我找不到任何相关文档。
由于您是自己创建 LoggerManager
(var logger = new LoggerManager();
),您可以简单地执行以下操作:
app.ConfigureExceptionHandler(logger);
如果您更喜欢使用 DI,您可以利用 IServiceProvider
通过 WebApplication.Services
属性:
var resolvedLoggerManager = app.Services.GetRequiredService<ILoggerManager>();
app.ConfigureExceptionHandler(resolvedLoggerManager);
对于在调用 builder.Build()
之前尝试获取依赖项的任何人(例如,用于服务设置),您可以使用中间 WebApplicationBuilder 来构建一个额外的 WebApplication 实例,如下所示(请注意,您不能调用 builder.Build()
两次,因此需要中间生成器)。
var builder = WebApplication.CreateBuilder(args);
// Use intermediate builder to obtain configuration etc
var intermediateBuilder = WebApplication.CreateBuilder(args);
var intermediateApp = intermediateBuilder.Build();
// Add services to the container.
var webHostEnvironment = intermediateApp.Services.GetRequiredService<IWebHostEnvironment>();
var configuration = new ConfigurationBuilder()
.AddJsonFile($"appsettings.{webHostEnvironment.EnvironmentName}.json", optional: false, reloadOnChange: false)
.Build();
...