You can embed both UserManager<ApplicationUser> and IHttpContextAccessor in the constructor of your class, and then:
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);
If you do not want to take a direct dependency on IHttpContextAccessor , but still want to use DI, you can create an interface to access your user:
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); } }
Then register it in the DI container and type in SomeClass :
public class SomeClass { private readonly IApplicationUserAccessor _userAccessor; public SomeClass(IApplicationUserAccessor userAccessor) { _userAcccessor = userAccessor; } public async Task DoSomethingWithUser() { var user = await _userAccessor.GetUser();
Other options include (as mentioned in the comments) not to insert anything, but require passing ApplicationUser as an argument to methods that require it (a good option), and require initialization before using any methods with the special Initialize(user) method (not so good, because that you cannot be sure that this method is called before using other methods).
source share