2017-01-10 87 views
1

我通过查询数据库中的数据来验证中间件中的HTTP请求,为此我需要使用HTTP请求中的数据配置ApplicationDbContext。我如何从ApplicationDbContext.OnConfiguring获得HTTP请求? (ASP .NET核心/实体框架的核心)如何从ApplicationDbContext.OnConfiguring获取HTTP上下文?

中间件

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 
     ... 
    } 

而且不要忘记在ConfigureServices注册IHttpContextAccessor到DI为“The IHttpContextAccessor service is not registered by default

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