我有一个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
答案 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>();
// ...
}
}