首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EntityFrameworkCore -启用DbContextPool时如何注入IPrincipal

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

Stack Overflow用户
提问于 2017-10-11 04:21:52
回答 1查看 683关注 0票数 2

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

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

代码语言:javascript
复制
public MyDBContext(DbContextOptions<MyDBContext> options, IPrincipal principal)

但我使用的是DBContextPool,它在WebAPI请求之间重用DbContext实例。

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

我想我可以遵循与HttpContextAccesor相同的方法,创建一个IClaimsPrincipalAccessor,将其注册为单例,并将其注入到我的Dbcontext中。

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

EN

回答 1

Stack Overflow用户

发布于 2018-07-30 04:53:26

您可以在启动时将IPrincipal注册为临时服务,如下所示:

代码语言:javascript
复制
public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    services.AddTransient<IPrincipal>(provider => 
                provider.GetService<IHttpContextAccessor>().HttpContext.User);
    // ...
}

然后,在您的DbContext构造函数上,您可以注入允许您获取当前IPrincipal实例的IServiceProvider,例如:

代码语言:javascript
复制
public class YourDbContext : DbContext
{
    private IServiceProvider _services;
    public YourDbContext(IServiceProvider services)
    {
        _services = services;
    }
    public void SomeMethod()
    {
        var principal = _services.GetService<IPrincipal>();
        // ...
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46675332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档