2016-05-25 3 views
3

Ich habe eine Klasse, die ein IPrinciple Objekt auf Konstruktion basierend auf dem aktuellen authentifizierten Benutzer festlegen muss.Konfigurieren Sie Simple Injector, um den aktuellen authentifizierten Benutzer zu injizieren

fand ich einen anderen Code, den ich versucht, aber es hat nicht funktioniert:

private readonly Lazy<IPrincipal> _principal; 

public MyService(Lazy<IPrincipal> principal) 
{ 
    _principal = principal; 
} 

Und ich Einfache Injector wie so konfiguriert:

container.Register(() => new Lazy<IPrincipal>(() => HttpContext.Current.User)); 

Offenbar _principal undefiniert/auf ein nicht gesetzt Instanz eines Objekts, wenn ich versuche, dies zu tun.

Ich habe auch versucht:

container.Register(() => new Lazy<IPrincipal>(() => Thread.CurrentPrincipal)); 

Das erlaubte mir _principal.Value.Identity.IsAuthenticated zu überprüfen, wurde aber immer false zurück.

Antwort

8

Der Grund für Ihre Probleme wird durch die Tatsache verursacht, dass Sie während der Konstruktion des Objektgraphen Laufzeitdaten in Ihre Komponenten injizieren. Wie erläutert here, ist dies eine schlechte Idee.

Stattdessen sollten Sie, wie der Artikel in den Artikeln angibt, die Entscheidung, diese Laufzeitdaten anzufordern, verzögern, bis die Grafik erstellt wurde. zu dem Zeitpunkt, zu dem diese Laufzeitdaten verfügbar sind.

Sie können dies tun, indem Sie eine benutzerdefinierte IPrincipal Umsetzung wie folgt zu erstellen:

public class HttpContextPrinciple : IPrincipal 
{ 
    public IIdentity Identity => HttpContext.Current.User.Identity; 
    public bool IsInRole(string role) => HttpContext.Current.User.IsInRole(role); 
} 

Und es wie folgt registrieren:

container.RegisterSingleton<IPrincipal>(new HttpContextPrinciple()); 

Diese Sie IPrincipal direkt in die Verbraucher wie MyService injizieren können. Dies vereinfacht die Verbraucher, da sie sich nicht mit leaky abstractions wie Lazy<T> befassen müssen.

Verwandte Themen