![](/img/trans.png)
[英]ASP.NET Core Identity does not inject UserManager<ApplicationUser>
[英]Inject ApplicationUser in ASP.NET Core MVC
我有一個需要ApplicationUser
的類(來自ASP.NET Identity)。 該實例應該是當前用戶。
public class SomeClass
{
public SomeClass(ApplicationUser user)
{
目前,我正在做的是從Controller中注入當前用戶:
var currentUser = await _userManager.GetUserAsync(User);
var instance = new SomeClass(currentUser);
現在我想使用Microsoft提供的依賴注入。 我無法弄清楚如何將ApplicationUser
添加到服務中。 它要求User
是Controller的一個屬性。
那么如何通過微軟提供的DI注入ApplicationUser
(當前用戶的實例)呢?
您可以將UserManager<ApplicationUser>
和IHttpContextAccessor
到類的構造函數中,然后:
public class SomeClass
{
private readonly UserManager<ApplicationUser> _userManager;
private readonly IHttpContextAccessor _context;
public SomeClass(UserManager<ApplicationUser> userManager,IHttpContextAccessor context)
{
_userManager = userManager;
_context = context;
}
public async Task DoSomethingWithUser() {
var user = await _userManager.GetUserAsync(_context.HttpContext.User);
// do stuff
}
}
如果您不想直接依賴IHttpContextAccessor
但仍想使用DI,則可以創建接口來訪問您的用戶:
public interface IApplicationUserAccessor {
Task<ApplicationUser> GetUser();
}
public class ApplicationUserAccessor : IApplicationUserAccessor {
private readonly UserManager<ApplicationUser> _userManager;
private readonly IHttpContextAccessor _context;
public ApplicationUserAccessor(UserManager<ApplicationUser> userManager, IHttpContextAccessor context) {
_userManager = userManager;
_context = context;
}
public Task<ApplicationUser> GetUser() {
return _userManager.GetUserAsync(_context.HttpContext.User);
}
}
然后在DI容器中注冊並注入SomeClass
:
public class SomeClass
{
private readonly IApplicationUserAccessor _userAccessor;
public SomeClass(IApplicationUserAccessor userAccessor)
{
_userAcccessor = userAccessor;
}
public async Task DoSomethingWithUser() {
var user = await _userAccessor.GetUser();
// do stuff
}
}
其他選項包括(如注釋中所述)不注入任何東西,但需要將ApplicationUser
作為參數傳遞給需要它的方法(良好選項),並且在使用具有特殊Initialize(user)
方法的任何方法之前需要初始化(不太好,因為你不能確保在使用其他方法之前調用此方法)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.