我目前正像下面这样在上下文中使用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替我处理。
答案 0 :(得分:0)
首先,您应该使用DI通过DBContext
而不是services.AddDbContext<ApplicationDbContext>
注册return new APDatabase.DBContext();
。
请按照以下步骤操作:
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;
}
}
注册DbContext
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
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();
}
}