6

Ich bin in ein ziemlich haariges Problem geraten. Es gibt wahrscheinlich eine einfache Lösung, aber ich kann es nicht finden!Konstruktor/Setter Injektion mit IoC in HttpHandler, ist es möglich?

Ich habe einen benutzerdefinierten HttpHandler, dass ich eine Anfrage verarbeiten möchte, bestimmte Informationen protokollieren und dann die Details in der Datenbank eingeben. Ich benutze NUnit und Castle Windsor.

Also ich habe zwei Schnittstellen; eine für die Protokollierung der anderen für die Dateneingabe, die Konstruktor injiziert werden. Ich habe schnell herausgefunden, dass es keinen Weg gibt, den Konstruktor aufzurufen, da immer der standardmäßige parameterlose Konstruktor aufgerufen wird.

Also dachte ich, ich würde Setter injection benutzen und Castle windsor es rauslassen. Das funktioniert tatsächlich, wenn ich container.Resolve<CustomHttpHandler>(); verwende Ich kann überprüfen, dass der Logger nicht null ist. (In Application_Start in Global.asax.cs)

Das Problem ist, obwohl Castle Windsor die Instanz erstellen kann die HTTP-Anwendung verwendet es nicht ??? Ich denke??

Der Grund dafür war, den Logger und den Data Repository Code isoliert durch Spott- und Unit-Tests zu testen.

Irgendwelche Ideen, wie ich dieses Problem lösen kann?

Danke!

+0

schafft Matt, es ist nicht cool, deine Frage so zu ändern, weil du alle vorhandenen Antworten für ungültig erklärst und jeden zwingst, zu aktualisieren. Bitte setzen Sie Ihre Bearbeitung zurück und erstellen Sie stattdessen eine neue Frage. –

+0

Hallo Mauricio. Sorry, offensichtlich bin ich neu, wie das funktioniert. Habe zurückgeworfen und eine neue Frage erstellt. Vielen Dank! – Matt

Antwort

2

Nicht möglich, zumindest nicht direkt. IHttpHandler-Objekte werden von der ASP.NET-Laufzeit instanziiert, und Windsor kann nicht an seiner Erstellung beteiligt werden. Sie können entweder:

  • Abhängigkeiten ziehen, indem Sie den Container als Service-Locator verwenden.
  • eine Basis-Handler einrichten, die injiziert und die Delegierten zu Ihren eigenen Handler (wie Spring does it)
  • Verwenden Sie den Behälter als Service-Locator für einen anderen Dienst, der die gesamte Anforderung verarbeitet (wie saret explained)
+0

Dang, ich hatte das Gefühl, dass es so sein könnte. Kannst du ein wenig deinen ersten Punkt erklären: Abhängigkeiten ziehen, indem du den Container als Service-Locator verwendest. Vielen Dank! – Matt

+0

@Matt: Rufen Sie von Ihrem HttpHandler den Container ab, um alle Abhängigkeiten abzurufen, die Sie benötigen. –

+0

Danke für die Antwort Mauricio. Verstanden! – Matt

2

Sie können den HttpHandler zu einem anderen Objekt aufrufen lassen, das die Anforderung tatsächlich verarbeitet. Also in Ihrer HttpHandler ProcessRequest-Methode würden Sie etwas tun wie folgt:

public void ProcessRequest(HttpContext context) 
{ 
var myHandlerObject = container.Resolve<HandlerObject>(); 
myHandlerObject.ProcessRequest(context or some state/info that is required) 
} 
+0

Hallo. Danke für die Idee. Es könnte die Lösung sein, eine der anderen Optionen Mauricio. Vielen Dank! – Matt