Asp.net core 无法从根提供程序解析作用域服务dbcontext

Asp.net core 无法从根提供程序解析作用域服务dbcontext,asp.net-core,asp.net-core-3.1,Asp.net Core,Asp.net Core 3.1,我已经创建了一个API日志记录中间件来记录对DB和Azure Microsoft insight的请求,但是由于某些原因,找不到数据库上下文的依赖项注入(gives无法从根提供程序解析作用域服务) API日志记录中间件 public class APILoggingMiddleware { private readonly TelemetryClient _telemetry; private readonly ILogger _logger; private rea

我已经创建了一个API日志记录中间件来记录对DB和Azure Microsoft insight的请求,但是由于某些原因,找不到数据库上下文的依赖项注入(gives无法从根提供程序解析作用域服务)

API日志记录中间件

public class APILoggingMiddleware
{
    private readonly TelemetryClient _telemetry;

    private readonly ILogger _logger;

    private readonly RequestDelegate _next;

    private APIsAuditContext db;

    public static IConfiguration _configuration;
    public APILoggingMiddleware(RequestDelegate next, ILoggerFactory loggerFactory, TelemetryClient telemetry, IConfiguration configuration, APIsAuditContext dbContext)
    {
        _configuration = configuration;

        _telemetry = telemetry;

        _next = next;

        _logger = loggerFactory.CreateLogger<APILoggingMiddleware>();

        db = dbContext;
    }

    //static class to simplify adding the middleware to the application’s pipeline

    public async Task Invoke(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        finally
        {

            Task logReq = logRequest(context);
            Task lodRes = logResponse(context);
        }
     }
  }
公共类apilogging中间件
{
专用只读遥测客户端_遥测;
专用只读ILogger\u记录器;
private readonly RequestDelegate\u next;
私有APIsAuditContext数据库;
公共静态IConfiguration\u配置;
公共ApilogingMiddleware(RequestDelegate next、ILoggerFactory loggerFactory、遥测客户端遥测、IConfiguration配置、APIsAuditContext dbContext)
{
_配置=配置;
_遥测=遥测;
_下一个=下一个;
_logger=loggerFactory.CreateLogger();
db=dbContext;
}
//静态类,以简化将中间件添加到应用程序管道的过程
公共异步任务调用(HttpContext上下文)
{
尝试
{
等待下一步(上下文);
}
最后
{
任务logReq=logRequest(上下文);
任务lodRes=日志响应(上下文);
}
}
}
数据库上下文

public class APIsAuditContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
        }
    }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
    }
    public APIsAuditContext(DbContextOptions<APIsAuditContext> options) : base(options) { }
    public DbSet<APIsRequestsAudit> APIsRequestsAudits { get; set; }


}
公共类APIsAuditContext:DbContext
{
配置时受保护的覆盖无效(DBContextOptions Builder Options Builder)
{
如果(!optionBuilder.IsConfigured)
{
}
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
}
公共APIsAuditContext(DbContextOptions选项):基(选项){}
公共DbSet APIsRequestsAudits{get;set;}
}
启动

 public class Startup
{
    public IConfiguration _configuration { get; }

    public Startup(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    public void ConfigureServices(IServiceCollection services)
    {

        services.AddDbContext<APIsAuditContext>(options => options.UseSqlServer(_configuration["ConnectionStrings:APIAuditConnection"]));

        services.AddApplicationInsightsTelemetry();
        services.AddControllers();
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {

        //Pipeline to API Logging 
        app.UseRequestResponseLogging();

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseHttpsRedirection();
        app.UseRouting();
        app.UseAuthorization();

        app.UseEndpoints(endpoints => 
        {
            endpoints.MapControllers();
        });



    }
}
公共类启动
{
公共IConfiguration\u配置{get;}
公共启动(IConfiguration配置)
{
_配置=配置;
}
public void配置服务(IServiceCollection服务)
{
services.AddDbContext(options=>options.UseSqlServer(_配置[“ConnectionString:APIAuditConnection]”);
services.AddApplicationInsightsTelemetry();
services.AddControllers();
services.AddMvc();
}
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境)
{
//管道到API日志记录
app.UseRequestResponseLogging();
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(端点=>
{
endpoints.MapControllers();
});
}
}
有人能帮忙吗?

根据,您必须在Invoke方法中注入作用域服务:

public class CustomMiddleware
{
    private readonly RequestDelegate _next;

    public CustomMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    // IMyScopedService is injected into Invoke
    public async Task Invoke(HttpContext httpContext, IMyScopedService svc)
    {
        svc.MyProperty = 1000;
        await _next(httpContext);
    }
}

这回答了你的问题吗@Brian(可能会指出明显的问题),在您的例子中,
IMyScopedService
APIsAuditContext-dbContext
或者更好的选择,
IAPIsAuditContext
(您可以直接插入它,而不需要接口,但这是一种不好的做法)。