我通过观看这个视频与Rowan Miller(链接在此:https://channel9.msdn.com/Series/Whats-New-with-ASPNET-5/06,22分钟处)了解到,在Startup.cs
中配置Entity Framework Core(之前称为EF7)到一个ASP.NET Core 1.0应用程序(之前称为ASP.NET 5)的方式如下:
public void ConfigureServices(IServiceCollection services)
{
//Entity Framework 7 scoped per request??
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<MyDbContext>(options =>
{
options
.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]);
});
//MVC 6
services.AddMvc();
}
这个DbContext将被限定在http请求的范围内,因此无论在整个http管道中(包括中间件或MVC)何时使用DbContext,我们都可以确定由DI容器注入的实例是相同的。
但问题在于它似乎并不起作用。在MVC的生命周期内,确实会注入相同的DbContext实例,但正如在这里所述:Entity Framework Core 1.0 unit of work with Asp.Net Core middleware or Mvc filter,我正在尝试插入以下中间件来实现某种集中式Commit/Rollback功能,以便在控制器执行结束后进行处理:
public class UnitOfWorkMiddleware
{
private readonly RequestDelegate _next;
private readonly MyDbContext _dbContext;
private readonly ILogger _logger;
public UnitOfWorkMiddleware(RequestDelegate next, MyDbContext dbContext, ILoggerFactory loggerFactory)
{
_next = next;
_dbContext = dbContext;
_logger = loggerFactory.CreateLogger<UnitOfWorkMiddleware>();
}
public async Task Invoke(HttpContext httpContext)
{
await _next.Invoke(httpContext);
_logger.LogInformation("Saving changes for unit of work if everything went good");
await _dbContext.SaveChangesAsync();
}
}
这个中间件在管道中紧接着MVC6之前。
//inside Configure(IApplicationBuilder app) in Startup.cs
app.UseMiddleware<UnitOfWorkMiddleware>();
app.UseMvcWithDefaultRoute();
我的中间件中的DbContext实例与MVC生命周期中注入的实例不同。
这是预期的吗?一个DbContext不应该被限定在一个http请求范围内吗?是否可能实现我想要的效果?
备选方案是使用MVC 6全局过滤器(如果我能找到如何执行此操作的文档)。我假设作为MVC 6框架的一部分,注入的DbContext实例将是相同的..