2017-03-29 2 views
0

IHttpContextAccessor 또는 httpContextAccessor를 주입하는 컨트롤러에서 로그인 한 사용자의 세부 정보를 얻을 수 있습니다. 그러나 내 봉사에서 그것을 시도 할 때, 그것은 효과가 없습니다. 나는ID 서비스에서 로그인 한 사용자 정보 얻기

{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 인터페이스를 만드는 것입니다 이러한 오류를 얻을. 내가 너무 내 IServiceCollection에 services.AddSingleton<IUserService, UserService>();을 추가 한

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); 
    } 
} 

: 그런 다음 그 구현이 getUser 메소드를 추가했습니다.

+0

요청 서비스가 이미 처리 된 응답을 보낸 후에 GetUser 메서드를 호출하는 것처럼 보입니다. GetUser 메서드는 어디서 액세스합니까? – Win

+0

IUserService를 삽입하고 데이터를 기록한 사용자의 세부 정보를 가져 와서 내 DB에 저장하는 NeaService 클래스가 있습니다. – user3127109

+0

그리고'NeaService' 클래스 싱글 톤입니까? – DavidG

답변

0

싱글 톤으로 UserService을 추가하지 마십시오. 그것에는 UserManager이 주입되어 있습니다. 그 자체에 주사 된 DbContext이 있습니다. 이렇게 사용하려고하면 폭발 할 것이고, 거의 확실하게 두 번째 사용으로는 작동하지 않을 것입니다. 대신 일시적 객체로 추가하는 것이 가장 안전합니다.

services.AddTransient<IUserService, UserService>(); 

이 항목을 추가하려면 객체의 계층 구조를 고려해야합니다. 싱글 톤 객체에 transient 객체가 삽입 된 경우 해당 일시 객체는 평생 동안 싱글 톤으로 유지되고 DI 프레임 워크에 의해 폐기되어 싱글 톤을 안전하지 않은 상태로 남겨 둡니다.

+0

나는 Transient와 Scoped도 만들려고했지만 너무 심해졌다. – user3127109

+0

어떻게 더 나쁠까요? – DavidG

+0

나는 나 자신을 놀라게했다! 다른 방법이 있습니까 !! – user3127109