您能否使用asp.net核心DI

时间:2019-04-29 17:22:58

标签: c# asp.net-core asp.net-identity

我目前正像下面这样在上下文中使用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 :(得分:0)

首先,您应该使用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();
        }
    
    }