Asp.net core 无法从根提供程序解析作用域服务dbcontext
我已经创建了一个API日志记录中间件来记录对DB和Azure Microsoft insight的请求,但是由于某些原因,找不到数据库上下文的依赖项注入(gives无法从根提供程序解析作用域服务) API日志记录中间件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
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
(您可以直接插入它,而不需要接口,但这是一种不好的做法)。