在 ASP.NET 核心 MVC 中注入 ApplicationUser
Inject ApplicationUser in ASP.NET Core MVC
我有一个 class 需要 ApplicationUser
(来自 ASP.NET 身份)。该实例应该是当前用户。
public class SomeClass
{
public SomeClass(ApplicationUser user)
{
目前,我正在做的是从控制器注入当前用户:
var currentUser = await _userManager.GetUserAsync(User);
var instance = new SomeClass(currentUser);
现在我想使用微软提供的Dependency Injection。我不知道如何将 ApplicationUser
添加到服务中。它需要 User
,这是控制器的 属性。
那么如何通过微软提供的DI注入ApplicationUser
(当前用户的实例)呢?
您可以将 UserManager<ApplicationUser>
和 IHttpContextAccessor
都注入到 class 的构造函数中,然后:
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
作为参数传递给需要它的方法(好选项),并且在使用具有特殊 [=18= 的任何方法之前需要初始化]方法(不太好,因为在使用其他方法之前你不能确定调用了这个方法)。
我有一个 class 需要 ApplicationUser
(来自 ASP.NET 身份)。该实例应该是当前用户。
public class SomeClass
{
public SomeClass(ApplicationUser user)
{
目前,我正在做的是从控制器注入当前用户:
var currentUser = await _userManager.GetUserAsync(User);
var instance = new SomeClass(currentUser);
现在我想使用微软提供的Dependency Injection。我不知道如何将 ApplicationUser
添加到服务中。它需要 User
,这是控制器的 属性。
那么如何通过微软提供的DI注入ApplicationUser
(当前用户的实例)呢?
您可以将 UserManager<ApplicationUser>
和 IHttpContextAccessor
都注入到 class 的构造函数中,然后:
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
作为参数传递给需要它的方法(好选项),并且在使用具有特殊 [=18= 的任何方法之前需要初始化]方法(不太好,因为在使用其他方法之前你不能确定调用了这个方法)。