2016-05-25 7 views
0

ich für einen DI Rahmen suchen, die dieses Szenario erfüllen kann:WebAPI DI-Framework, das versteht HttpContext.User

Jeder Controller verfügt über einen Konstruktor wie dieses

public ThisController(ThatRepository repo) 

Jedes Repository einen Controller wie folgt hat:

public ThatRepository (DataSource ds) 

Es gibt einen Master Datasource, aber das wird nie in das Repository übergeben. Stattdessen benötigt es:

Gibt es irgendwelche DI-Frameworks für WebAPI, die dies out-of-the-Box unterstützen würde?

+0

[Dependency-Injektion anti-Muster: Spritzen Laufzeitdaten in Komponenten] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=99) – NightOwl888

+0

Wenn ich Da keine Run-Time-Daten injiziert werden, ist es nicht sinnvoll, ein DI-Framework zu verwenden. Ich werde nur einen einzigen Kontextstamm erstellen und es fertig machen. –

Antwort

0

Ich glaube, dass man fast jeden DI-Container für einen solchen Zweck verwendet werden könnte, um aktuelle HttpContext Registrierung (oder den aktuellen Benutzer Identity) im Inneren des Behälters und injizieren es dann für Ihre DataSource Instanz zu konstruieren.

Hier ist es eine einfache Lösung HttpContext in SimpleInjector mit (Sie können leicht Anschluss der Code zu jedem DI Rahmen Sie mögen):

container.Register<HttpContextBase>(() => 
    new HttpContextWrapper(HttpContext.Current), 
    Lifestyle.Scoped); 

container.Register<DataSource>(() => 
    { 
     var httpContext = container.GetInstance<HttpContextBase>(); 
     return MasterDataSource.WithUser(httpContext?.User?.Identity?.Name); 
    }, 
    Lifestyle.Scoped); 
0

Zusammenfassung der HttpContext hinter einer Schnittstelle steuern Sie und Ihre DI-Container von Auswahl lösen das bei Bedarf.

public interface ICurrentUser { 
    string Name{get;} 
} 

Eine konkrete Implementierung dieser Schnittstelle aussehen kann ...

public class UserProvider : ICurrentUser { 
    HttoContextBase httpContext; 
    UserProvider(){ 
     httpContext = HttpContext.Current; 
    } 
    public string Name { 
     get{ return httpContext?.User?.Identity?.Name ?? string.Empty; } 
    } 
} 

Sie Ihre Schnittstelle/Vertrag mit Ihrem DI-Container registrieren und es beheben, wenn Sie Ihre DataSource benötigt.

public void SomeSetupMethod(ICurrentUser user) { 
    MasterDataSource.WithUser(user?.Name); 
}