从服务中的标识获取登录的用户详细信息



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

{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>();

不要将UserService添加为单例。它有一个注入的UserManager,它本身有一个注入的DbContext,如果你尝试像这样使用它,它会爆炸,而且几乎可以肯定它会被处理掉,所以在第二次使用时它不起作用。相反,将其添加为瞬态对象是最安全的:

services.AddTransient<IUserService, UserService>();

除此之外,您必须考虑对象的层次结构。如果单一实例对象注入了瞬态对象,则该瞬态对象将在生存期内保留在单一实例中,并且可能会由 DI 框架释放,从而使单一实例处于不安全状态。

相关内容

  • 没有找到相关文章

最新更新