2017-01-10 10 views
1

Я проверяю HTTP-запросы в промежуточном программном обеспечении, запрашивая данные в базе данных, и для этого мне нужно настроить ApplicationDbContext с данными в HTTP-запросе. Как я могу получить HTTP-запрос из ApplicationDbContext.OnConfiguring? (ASP .NET ядро ​​/ Entity Framework ядро)Как получить HTTP-контекст из ApplicationDbContext.OnConfiguring?

Middleware

public class TeamAuthentication 
{ 
    public async Task Invoke(HttpContext context, ApplicationDbContext db) 
    { 
     My.CheckToken(db); 
     // ... 

DbContext

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    private ILoggerFactory loggerFactory; 

    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options, ILoggerFactory _loggerFactory) 
     : base(options) 
    { 
     loggerFactory = _loggerFactory; 
    } 

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
    { 
     // how to reach HttpContext here ? 
     // ... 

ответ

1

Как вы уже нашли, EF поддерживает использование DbContext с контейнером инъекции зависимостей. Вводит IHttpContextAccessor в ваших зависимости и использовать его для получения информации о текущем HttpContext:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    private readonly ILoggerFactory _loggerFactory; 
    private readonly IHttpContextAccessor _contextAccessor; 

    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options, ILoggerFactory loggerFactory, IHttpContextAccessor contextAccessor) 
    : base(options) 
    { 
     _loggerFactory = loggerFactory; 
     _contextAccessor = contextAccessor; 
    } 

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
    { 
     // use _contextAccessor.HttpContext here 
     ... 
    } 

И не забудьте зарегистрировать IHttpContextAccessor к DI в ConfigureServices как «The IHttpContextAccessor service is not registered by default»

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddSingleton<Microsoft.AspNetCore.Http.IHttpContextAccessor, Microsoft.AspNetCore.Http.HttpContextAccessor>(); 
    ... 
}