EntityFrameworkCore - 如何在启用DbContextPool时注入IPrincipal

时间:2017-10-10 20:21:52

标签: entity-framework ef-core-2.0

我有一个aspnet核心MVC应用程序,我需要注入当前请求的IPrincipal,以便我知道当前登录用户是谁。我跟着this文章没问题。

现在我需要IPrincipal中的Dbcontext来自动填充审核字段(CreatedBy,UpdatedBy等)。天真地我可以在我的IPrincipal构造函数中注入DbContext

public MyDBContext(DbContextOptions<MyDBContext> options, IPrincipal principal)

但我正在使用DBContextPool,它在WebAPI请求中重用DbContext个实例。

在这种情况下注入IPrincipal的正确方法是什么?

-------------------更新----------------------

我想我可以采用与HttpContextAccesor相同的方法,并创建一个IClaimsPrincipalAccessor,将其注册为单身并将其注入我的Dbcontext

对于asp net core应用程序,我需要HttpContextClaimsPrincipalAccesor,其中ClaimsPrincipal来自HttpContext.User

1 个答案:

答案 0 :(得分:1)

您可以在启动程序上将IPrincipal注册为临时服务,例如:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    services.AddTransient<IPrincipal>(provider => 
                provider.GetService<IHttpContextAccessor>().HttpContext.User);
    // ...
}

然后在DbContext构造函数上注入IServiceProvider,它将使您能够获取当前的IPrincipal实例,例如:

public class YourDbContext : DbContext
{
    private IServiceProvider _services;
    public YourDbContext(IServiceProvider services)
    {
        _services = services;
    }
    public void SomeMethod()
    {
        var principal = _services.GetService<IPrincipal>();
        // ...
    }
}