您可以使用 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
。
按照以下步骤操作:
数据库上下文:
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")));
用例
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();
}
}
我目前正在为我的上下文使用 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
。
按照以下步骤操作:
数据库上下文:
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")));
用例
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(); } }