将依赖项传递给应用程序.在.NET 6中的program.cs中的[Methods()]



在.NET 5及以前版本中,我们曾经有一个startup.cs文件,里面有ConfigureServices和Configure Method。在下面的函数中,我添加了ILoggerManager作为函数的参数,然后将其传递给应用程序。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();
});
}

但是在.NET6中没有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();

我的问题是如何将依赖项传递给应用程序。ConfigureExceptionHandler((函数。我在上面找不到任何文件。

由于您自己创建LoggerManager(var logger = new LoggerManager();(,您可以简单地执行:

app.ConfigureExceptionHandler(logger);

如果您喜欢使用DI,您可以使用通过WebApplication.Services属性暴露的IServiceProvider

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();
...

最新更新