【问题标题】:Pass dependency to app.[Methods()] in program.cs in .NET 6将依赖项传递给 .NET 6 中 program.cs 中的 app.[Methods()]
【发布时间】:2021-11-05 17:27:40
【问题描述】:

在 .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 方法,所有方法或函数都以程序方式调用,没有任何类或方法声明,如下所示:

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() 函数。我找不到任何文档。

【问题讨论】:

    标签: c# asp.net asp.net-core asp.net-core-webapi .net-6.0


    【解决方案1】:

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

    app.ConfigureExceptionHandler(logger);
    

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

    var resolvedLoggerManager = app.Services.GetRequiredService<ILoggerManager>();
    app.ConfigureExceptionHandler(resolvedLoggerManager);
    

    【讨论】:

      【解决方案2】:

      对于在调用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();
      
      ...
      

      【讨论】:

        猜你喜欢
        • 2016-10-08
        • 2016-10-19
        • 2018-12-02
        • 2017-07-18
        • 2022-11-02
        • 1970-01-01
        • 2022-11-08
        • 2013-11-29
        • 1970-01-01
        相关资源
        最近更新 更多