Entity framework EntityFrameworkCore-启用DbContextPool时如何注入IPrincipal

Entity framework EntityFrameworkCore-启用DbContextPool时如何注入IPrincipal,entity-framework,ef-core-2.0,Entity Framework,Ef Core 2.0,我有一个aspnet core MVC应用程序,我需要注入当前请求的IPrincipal,以便知道谁是当前登录的用户。我毫无问题地看完了这篇文章 现在我需要Dbcontext中的IPrincipal自动填充审核字段(CreatedBy、UpdatedBy等)。由于天真,我可以在我的DbContext构造函数中插入IPrincipal: public MyDBContext(DbContextOptions<MyDBContext> options, IPrincipal princi

我有一个aspnet core MVC应用程序,我需要注入当前请求的
IPrincipal
,以便知道谁是当前登录的用户。我毫无问题地看完了这篇文章

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

public MyDBContext(DbContextOptions<MyDBContext> options, IPrincipal principal)
public MyDBContext(DbContextOptions选项,IPrincipal主体)
但是我使用的是
DBContextPool
,它跨WebAPI请求重用
DbContext
实例

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

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

我想我可以遵循与的相同方法,创建一个
ICLAIMS PrincipalAccessor
,将其注册为单例,并将其注入我的
Dbcontext

对于asp net核心应用程序,我需要一个
HttpContextClaimsPrincipaAccessor
,其中
ClaimsPrincipal
来自
HttpContext。用户可以在启动时将注册为临时服务,如:

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

有人知道怎么做吗?知道为什么
ClaimsPrincipal
没有接口吗?
HttpContext.User
的类型是
ClaimsPrincipal
而不是
IPrincipal
。因此,以您的方式进行操作(我完全同意这是正确的方式)让我感到困惑,因为我还需要阅读声明,并将您在这里的内容转换为
principal
ClaimsPrincipal
保证在运行时工作,但对单元测试非常不友好,因为我无法模拟
iclaimsmprincipal
。奇怪的是:-/这个解决方案不起作用,因为正如最初的问题所述,使用池需要有一个只接受DbContextOptions的公共构造函数。添加第二个参数会导致异常。在尝试了OP所做的事情之后,我来到这里寻找相同的答案。@MikeG在这种情况下,我认为唯一的方法是在中间层(数据访问层,…)上完成,而不是在DbContext内部。实际上,收集这些信息似乎不是DbContext的责任。
public class YourDbContext : DbContext
{
    private IServiceProvider _services;
    public YourDbContext(IServiceProvider services)
    {
        _services = services;
    }
    public void SomeMethod()
    {
        var principal = _services.GetService<IPrincipal>();
        // ...
    }
}