Entity framework EntityFrameworkCore-启用DbContextPool时如何注入IPrincipal
我有一个aspnet core MVC应用程序,我需要注入当前请求的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
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>();
// ...
}
}