我有一个aspnet core MVC应用程序,我需要注入当前请求的IPrincipal,以便知道谁是当前登录的用户。我关注了this的文章,没有任何问题。
现在,我需要Dbcontext中的IPrincipal自动填充审计字段(CreatedBy、UpdatedBy等)。由于太天真,我可以在我的DbContext构造函数中注入IPrincipal:
public MyDBContext(DbContextOptions<MyDBContext> options, IPrincipal principal)但我使用的是DBContextPool,它在WebAPI请求之间重用DbContext实例。
在这种情况下,注入IPrincipal的正确方式是什么?
我想我可以遵循与HttpContextAccesor相同的方法,创建一个IClaimsPrincipalAccessor,将其注册为单例,并将其注入到我的Dbcontext中。
对于asp net核心应用程序,我需要一个HttpContextClaimsPrincipalAccesor,其中ClaimsPrincipal来自HttpContext.User。
发布于 2018-07-30 04:53:26
您可以在启动时将IPrincipal注册为临时服务,如下所示:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddTransient<IPrincipal>(provider =>
provider.GetService<IHttpContextAccessor>().HttpContext.User);
// ...
}然后,在您的DbContext构造函数上,您可以注入允许您获取当前IPrincipal实例的IServiceProvider,例如:
public class YourDbContext : DbContext
{
private IServiceProvider _services;
public YourDbContext(IServiceProvider services)
{
_services = services;
}
public void SomeMethod()
{
var principal = _services.GetService<IPrincipal>();
// ...
}
}https://stackoverflow.com/questions/46675332
复制相似问题