你可以将你需要的任何东西注入到Configure
方法。您已经使用以下行将其添加到服务集合中:
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
因此,您需要做的就是将其添加到方法的参数列表中,如下所示:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IHttpContextAccessor accessor)
{
// make use of it here
}
顺便说一句:我还想指出,您手动创建一个实例有点代码味道DbContext
当您使用依赖注入时,在静态帮助器类中。
更新以回复评论
为了稍微整理一下,我将首先更改您的启动来配置 DbContext,如下所示:
public class Startup
{
private readonly IConfiguration configuration;
public Startup(IConfiguration configuration)
{
this.configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
// register other things here...
services.AddDbContext<DataContext>(o => o.UseSqlServer(
config.GetConnectionString("MyConnectionString") // from appsettings.json
));
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// set up app here...
}
}
然后您可以删除.GetOptions()
方法来自MyDbContext
,并将构造函数更改为:
public MyDbContext(DbContextOptions<MyDbContext> options, IHttpContextAccessor httpContextAccessor)
: base(options)
{
_httpContextAccessor = httpContextAccessor;
}
然后你注入一个实例MyDbContext
进入任何需要访问它的类。问题是(据我所知)DI 不能很好地处理静态类/方法,并且您正在使用扩展方法HttpResponse
记录您的错误。
在我看来,最好创建一个类来负责记录错误并依赖于您的MyDbContext
并将其注入Configure
method:
public class ErrorLogger
{
private MyDataContext db;
public ErrorLogger(MyDataContext db) => this.db = db;
public void LogError(IExceptionHandlerFeature error)
{
Log log = new Log();
log.Message = error.Error.Message;
UnitOfWork uow = new UnitOfWork(this.db);
uow.LogRepo.AddOrUpdate(log);
await uow.CompleteAsync(false);
}
}
像注册其他东西一样将其注册到 DI 容器中,然后将其注入Configure
而不是 HTTP 访问器:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ErrorLogger logger)
{
app.UseExceptionHandler(builder => builder.Run(async context =>
{
var error = context.Features.Get<IExceptionHandlerFeature>();
logger.LogError(error);
await context.Response.WriteAsync(error.Error.Message);
}));
}
这个我没测试过,也不熟悉.UseExceptionHandler(...)
因为我使用应用程序洞察来记录异常等(如果您还没有看到它,请看一下)。需要注意的一件事是您的依赖项的范围;你的 DbContext 将是Scoped
默认情况下(我认为你应该保持这种方式),这意味着你不能将它注入Singleton
对象。