2017-03-29 13 views
0

IHttpContextAccessorまたはhttpContextAccessorを注入したコントローラからログインしたユーザーの詳細を取得できます。しかし、私のサービスでそれを試してみると、うまくいきません。私は私が行っていることはIUserServiceインターフェイスを作成され、これらのエラーにサービスの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... 

を取得します。私はあまりにも私の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があります。このように使用しようとすると爆発してしまいます。代わりに、一時オブジェクトとして追加するのが最も安全です:

これを追加するには、オブジェクトの階層を考慮する必要があります。シングルトンオブジェクトに一時的なオブジェクトが挿入されている場合、その一時的なオブジェクトは存続期間中はシングルトンに残り、DIフレームワークによって処理され、シングルトンを安全でない状態にします。

+0

私はTransientとScopedを作成しようとしましたが、それはさらに悪化しました! – user3127109

+0

どのように悪化する可能性がありますか? – DavidG

+0

私は自分自身に驚いています!他の方法はありますか? – user3127109

関連する問題