Simple Injector: Wie injiziere ich HttpContext?

7

Ich habe begonnen, Simple Injector als meinen DI-Container zu verwenden (meistens aus Gründen der Leistung: wenn jemand Vorschläge hat, lass es mich wissen), aber einige der Klassen, die ich geschrieben habe, benutzen HttpContextBase als Konstruktorparameter. Ich habe beschlossen, es jetzt aus dem Konstruktor zu entfernen und eine Eigenschaft zu erstellen, etwa so:

%Vor%

aber ich mag diese Lösung nicht ... irgendwelche Ratschläge?

    
MizRaeL 06.02.2014, 10:47
quelle

1 Antwort

22

Sie sollten Konstruktorinjektionen gegenüber allem anderen bevorzugen. Dies ist fast immer möglich. Sie können Ihre HttpContextBase wie folgt registrieren:

%Vor%

Dies kann zu einem Problem beim Aufruf von Verify() führen, da HttpContext.Current während des Starts der Anwendung null ist und HttpContextWrapper das Übergeben von null an den Konstruktor nicht erlaubt.

Es ist immer gut zu versuchen, Ihre Konfiguration überprüfbar zu halten , und Sie können diese Registrierung zu den folgenden ändern:

%Vor%

FakeHttpContext ist eine leere HttpContextBase -Implementierung, um zu verhindern, dass null zurückgegeben wird, wenn der Container überprüft wird. Das FakeHttpContext ist einfach das:

%Vor%

Beachten Sie jedoch, dass es sich bei HttpContext um Laufzeitdaten und das Einfügen von Laufzeitdaten in Komponenten während der Erstellung handelt ein Anti-Muster . Anstatt den HttpContext oder eine Abstraktion darüber in Ihre Komponenten zu injizieren, sollten Sie eine anwendungsspezifische Abstraktion erstellen, die dem Benutzer das bietet, was er tatsächlich benötigt (z. B. eine Benutzeridentität oder Mandanten-ID). Die Implementierung dieser Abstraktion kann einfach HttpContext.Current intern aufrufen, was die Notwendigkeit von HttpContext vollständig verhindert.

    
Steven 06.02.2014, 11:35
quelle