在ASP.NET Core MVC中注入ApplicationUser

dpp*_*dpp 7 c# dependency-injection asp.net-core-mvc asp.net-core asp.net-core-identity

我有一个需要的类ApplicationUser(来自ASP.NET Identity).该实例应该是当前用户.

public class SomeClass
{
    public SomeClass(ApplicationUser user)
    {
Run Code Online (Sandbox Code Playgroud)

目前,我正在做的是从Controller中注入当前用户:

var currentUser = await _userManager.GetUserAsync(User);
var instance = new SomeClass(currentUser);
Run Code Online (Sandbox Code Playgroud)

现在我想使用Microsoft提供的依赖注入.我无法弄清楚如何添加ApplicationUser到服务中.它要求User哪个属于Controller的属性.

那么如何ApplicationUser通过微软提供的DI 注入(当前用户的实例)?

Evk*_*Evk 5

您可以将两者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
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您不想直接依赖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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将其注册到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
    }
}
Run Code Online (Sandbox Code Playgroud)

其他选项包括(如注释中所述)不注入任何内容,但需要将其ApplicationUser作为参数传递给需要它的方法(好的选项),并且需要在使用带有特殊Initialize(user)方法的任何方法之前进行初始化(不太好,因为您不能确定此方法是否是在使用其他方法之前调用)。