简体   繁体   English

在ASP.NET Core MVC中注入ApplicationUser

[英]Inject ApplicationUser in ASP.NET Core MVC

I have a class that requires ApplicationUser (from ASP.NET Identity). 我有一个需要ApplicationUser的类(来自ASP.NET Identity)。 The instance should be the current user. 该实例应该是当前用户。

public class SomeClass
{
    public SomeClass(ApplicationUser user)
    {

Currently, what I'm doing is I inject the current user from the Controller: 目前,我正在做的是从Controller中注入当前用户:

var currentUser = await _userManager.GetUserAsync(User);
var instance = new SomeClass(currentUser);

Now I want to use Dependency Injection provided by Microsoft. 现在我想使用Microsoft提供的依赖注入。 I can't figure out how am I going to add ApplicationUser to the services. 我无法弄清楚如何将ApplicationUser添加到服务中。 It requires User which is a property of the Controller. 它要求User是Controller的一个属性。

So how do you inject ApplicationUser (instance of the current user) via DI provided by Microsoft? 那么如何通过微软提供的DI注入ApplicationUser (当前用户的实例)呢?

You can inject both UserManager<ApplicationUser> and IHttpContextAccessor to the constructor of your class, then: 您可以将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
    }
}

If you don't want to take direct dependency on IHttpContextAccessor but still want to use DI, you can create interface to access your user: 如果您不想直接依赖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);
    }
}

Then register it in DI container and inject into SomeClass : 然后在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
    }
}

Other options include (as mentioned in comments) not inject anything but require passing ApplicationUser as argument to the methods which require it (good option) and require initialization before using any methods with special Initialize(user) method (not so good, because you cannot be sure this method is called before using other methods). 其他选项包括(如注释中所述)不注入任何东西,但需要将ApplicationUser作为参数传递给需要它的方法(良好选项),并且在使用具有特殊Initialize(user)方法的任何方法之前需要初始化(不太好,因为你不能确保在使用其他方法之前调用此方法)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM