您可以使用 asp.net 核心 DI 将当前用户传递到 dbcontext 中吗

Can you pass current user into dbcontext using asp.net core DI

我目前正在为我的上下文使用 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;
}

然后我可以在每个控制器的构造函数中将其设置为上下文中的 属性。这是目前我能看到的唯一方法,但如果可能的话,我更愿意让 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();
        }
    
    }