您可以在类的构造函数中注入
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);
}
}
如果您不想直接依赖于,但仍希望使用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();
}
}
其他选项包括(如评论中所述)不注入任何内容,而是要求将
ApplicationUser
作为参数传递给需要它的方法(好的选择),并且在使用任何具有特殊
Initialize(user)
方法的方法之前要求初始化(不太好,因为您不能确定在使用其他方法之前是否调用了此方法)。
Init(context)
可能是一个替代方案,我想知道如何强制执行它的调用。 - kazinix