2017-03-29 3 views
0

Ich kann Details des angemeldeten Benutzers von Controller, der IHttpContextAccessor httpContextAccessor injiziert, abrufen. Aber wenn ich es in meinem Service versuche, funktioniert es nicht. Ich bekomme diese FehlerAbrufen von Benutzerdetails von Identität im Dienst

{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... 

Was ich getan habe, ist eine IUserService Schnittstelle erstellen. Dann fügte GetUser Methode dort mit seiner Umsetzung als:

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

ich services.AddSingleton<IUserService, UserService>(); in meinem IServiceCollection auch hinzugefügt haben.

+0

Es scheint, dass Sie die GetUser-Methode aufrufen, nachdem die Antwort zurückgeschickt wurde, in der pro Anforderung bereits Dienste entsorgt wurden. Wo greifen Sie auf die GetUser-Methode zu? – Win

+0

Ich habe NeaService-Klasse, wo ich IUserService injiziere und die Details des angemeldeten Benutzers, der die Daten aufgezeichnet hat, erhalten und in meiner Datenbank speichern. – user3127109

+0

Und ist die 'NeaService' Klasse auch Singleton? – DavidG

Antwort

0

Nicht UserService als Singleton hinzufügen. Es hat eine injizierte UserManager, die selbst eine injizierte DbContext hat, die explodieren wird, wenn Sie versuchen, es so zu verwenden, und es ist fast sicher, dass so entsorgt wird, so auf zweiter Verwendung wird es nicht funktionieren. Stattdessen werden Sie am sichersten als vorübergehendes Objekt hinzugefügt:

Um dies hinzuzufügen, müssen Sie Ihre Hierarchie von Objekten berücksichtigen. Wenn in ein Singleton-Objekt ein transientes Objekt injiziert wird, bleibt dieses transiente Objekt für die gesamte Lebensdauer im Singleton und wird wahrscheinlich vom DI-Framework entsorgt, wodurch Ihr Singleton in einem unsicheren Zustand bleibt.

+0

Ich habe versucht Transient und Scoped zu machen, aber es ging einfach schlechter! – user3127109

+0

Wie könnte es schlimmer sein? – DavidG

+0

Ich bin selbst überrascht !! Gibt es noch andere Möglichkeiten? – user3127109

Verwandte Themen