簡體   English   中英

在ASP.NET Core MVC中注入ApplicationUser

[英]Inject ApplicationUser in ASP.NET Core MVC

我有一個需要ApplicationUser的類(來自ASP.NET Identity)。 該實例應該是當前用戶。

public class SomeClass
{
    public SomeClass(ApplicationUser user)
    {

目前,我正在做的是從Controller中注入當前用戶:

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

現在我想使用Microsoft提供的依賴注入。 我無法弄清楚如何將ApplicationUser添加到服務中。 它要求User是Controller的一個屬性。

那么如何通過微軟提供的DI注入ApplicationUser (當前用戶的實例)呢?

您可以將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
    }
}

如果您不想直接依賴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作為參數傳遞給需要它的方法(良好選項),並且在使用具有特殊Initialize(user)方法的任何方法之前需要初始化(不太好,因為你不能確保在使用其他方法之前調用此方法)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM