从服务中的身份登录用户详细信息

时间:2017-03-29 14:24:00

标签: asp.net service asp.net-identity .net-core

我可以从控制器注入IHttpContextAccessor httpContextAccessor获取登录用户的详细信息。但是当我在我的服务中尝试它时,它不起作用。我收到这些错误

{System.Exception: Cannot access a disposed object. A common cause of this error is disposing a context that was resolved from dependency injection and then later trying to use the same context instance elsewhere in your application. This may occur if you a...

我所做的是创建 IUserService 界面。然后在其中添加了GetUser方法,其实现为:

public class UserService : IUserService
{
    private readonly IHttpContextAccessor _context;
    private readonly UserManager<User> _userManager;
    public UserService(IHttpContextAccessor context, UserManager<User> userManager)
    {
        _context = context;
        _userManager = userManager;
    }
    public async Task<User> GetUser()
    {
        return await _userManager.FindByNameAsync(_context.HttpContext.User.Identity.Name);
    }
}

我在IServiceCollection中也添加了services.AddSingleton<IUserService, UserService>();

1 个答案:

答案 0 :(得分:0)

不要将UserService添加为单身人士。它有一个注入的UserManager,它本身有一个注入的DbContext如果你试图像这样使用它会爆炸,它几乎肯定会被处置,所以第二次使用它不会工作。相反,您最安全地将其添加为瞬态对象:

services.AddTransient<IUserService, UserService>();

要添加到此,您必须考虑对象的层次结构。如果一个单例对象注入了一个瞬态对象,那么该临时对象将在生命周期内保留单例,并且可能会被DI框架处理,使您的单例处于不安全状态。

相关问题