Entity Framework Core 1.0 DbContext sem escopo para solicitação http
Eu entendi assistindo este vídeo com Rowan Millerhttps://channel9.msdn.com/Series/Whats-New-with-ASPNET-5/06 (no minuto 22) que a maneira de configurar o Entity Framework Core (anteriormente conhecido como EF7) em um aplicativo ASP.NET Core 1.0 (anteriormente conhecido como ASP.NET 5) emStartup.cs
é o seguinte:
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();
}
e essaeste DbContext terá o escopo definido para uma solicitação http para que sempre que no código do pipeline http (incluindo middleware ou MVC) um DbContext seja usado, tenhamos certeza de que a instância injetada pelo contêiner de DI será a mesma.
Mas o problema é que parece não funcionar dessa maneira. Durante a vida útil do MVC, é verdade que a instância DbContext injetada é a mesma, mas conforme descrito aqui:Unidade de trabalho do Entity Framework Core 1.0 com middleware Asp.Net Core ou filtro Mvc Estou tentando conectar ao pipeline o seguinte middleware para obter algum tipo de Confirmação / Reversão centralizada depois que um controlador finaliza a execução:
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();
}
}
e esse middleware é imediatamente anterior ao MVC6 no pipeline
//inside Configure(IApplicationBuilder app) in Startup.cs
app.UseMiddleware<UnitOfWorkMiddleware>();
app.UseMvcWithDefaultRoute();
A instância DbContext no meu Middleware não é a mesma que a instância que está sendo injetada durante o tempo de vida do MVC.
Isso é esperado? Um DbContext não deve ter escopo definido para uma solicitação http? É possível alcançar o que eu estava tentando alcançar?
O plano B seria usar umFiltro global MVC 6 (se eu puder encontrar alguma documentação sobre como fazer isso). Suponho que fazendo parte da estrutura do MVC 6, a instância DbContext injetada será a mesma.