您能否使用核心 DI 将当前用户传递到数据库上下文 asp.net



我目前正在将DI用于我的上下文,如下所示。

services.AddTransient<APDatabase.DBContext>(provider =>
{
    return new APDatabase.DBContext();
});

是否可以将当前登录的用户传递到此状态?我目前在控制器中获取用户,如下所示。

public NavigationController(APDatabase.DBContext context, IHttpContextAccessor httpContextAccessor)
{
    this._context = context;
    this._currentUser = httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
}

然后,我可以在每个控制器的 contsructor 中将其设置为上下文中的属性。这是我目前能看到的唯一方法,但如果可能的话,更愿意让 DI 为我处理它。

首先,您应该使用 DI 通过 services.AddDbContext<ApplicationDbContext> 而不是 return new APDatabase.DBContext(); 来注册DBContext

请按照以下步骤操作:

  1. 数据库上下文:

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        private HttpContext _httpContext;
        public string CurrentUser => _httpContext.User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options,
            IHttpContextAccessor httpContextAccessor)
            : base(options)
        {
            _httpContext = httpContextAccessor.HttpContext;
        }        
    }
    
  2. 注册DbContext

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    
  3. 使用案例

    public class HomeController : Controller
    {
        private readonly ApplicationDbContext _appDbContext;
        public HomeController(ApplicationDbContext applicationDbContext)
        {
            _appDbContext = applicationDbContext;
        }        
        public async Task<IActionResult> Index()
        {
            var user = _appDbContext.CurrentUser;
            return View();
        }
    }
    

相关内容

  • 没有找到相关文章

最新更新