我可以从注入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 框架释放,从而使单一实例处于不安全状态。