Можете ли вы передать текущего пользователя в dbcontext с помощью ядра DI asp.net - PullRequest
0 голосов
/ 29 апреля 2019

В настоящее время я использую 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 обрабатывал его для меня, если это возможно.

1 Ответ

0 голосов
/ 30 апреля 2019

Во-первых, вы должны использовать DI, чтобы зарегистрировать DBContext на services.AddDbContext<ApplicationDbContext> вместо return new APDatabase.DBContext();.

Выполните следующие действия:

  1. DbContext:

    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. UseCase

    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();
        }
    
    }
    
...