6

Mi sono imbattuto in un problema piuttosto peloso. Probabilmente c'è una soluzione semplice ma non riesco a trovarla!Iniezione Costruttore/incastonatore utilizzando IoC in HttpHandler, è possibile?

Ho un HttpHandler personalizzato che voglio elaborare una richiesta, registrare alcune informazioni e inserire i dettagli nel database. Sto usando NUnit e Castle Windsor.

Quindi ho due interfacce; uno per la registrazione degli altri per l'immissione dei dati, che vengono iniettati dal costruttore. Ho rapidamente scoperto che non esiste un modo per chiamare il costruttore in quanto viene chiamato sempre il costruttore senza parametri predefinito.

Quindi ho pensato di usare Setter injection e ho lasciato che il windsor Castle lo risolvesse. Questo in realtà funziona come quando uso container.Resolve<CustomHttpHandler>(); Posso verificare che il logger non sia nullo. (In Application_Start in Global.asax.cs)

Il problema è che Castle Windsor può creare l'istanza che l'applicazione http non sta utilizzando ??? Credo??

Fondamentalmente l'intera ragione per farlo in questo modo era essere in grado di testare il logger e il codice del repository di dati in isolamento tramite simulazione e test delle unità.

Qualche idea su come posso risolvere questo problema?

Grazie!

+0

Matt, non è bello cambiare la tua domanda in questo modo perché invalidi tutte le risposte esistenti e costringi tutti ad aggiornarle. Si prega di annullare la modifica e creare una nuova domanda. –

+0

Ciao Mauricio. Scusa, ovviamente sono nuovo di come funziona. Sono tornati e ha creato una nuova domanda. Grazie! – Matt

risposta

2

Non possibile, almeno non direttamente. Gli oggetti IHttpHandler sono istanziati dal runtime ASP.NET e non consentono a Windsor di essere coinvolto nella sua creazione. È possibile:

  • Pull dipendenze, utilizzando il contenitore come un servizio di localizzazione.
  • Impostare un gestore di base che crea, inietta e delegati per i propri gestori (vedere come Spring does it)
  • Usare il contenitore come un localizzatore di servizio per un altro servizio che gestisce l'intera richiesta (come saret explained)
+0

Dang, ho avuto la sensazione che potrebbe essere il caso. Potresti spiegare un po 'il tuo primo punto: Tirare le dipendenze, usando il contenitore come un servizio di localizzazione. Grazie! – Matt

+0

@Matt: dal tuo HttpHandler, chiama il contenitore per recuperare le dipendenze di cui hai bisogno. –

+0

Grazie per la risposta Mauricio. Inteso! – Matt

2

Ciò che si potrebbe fare è chiamare HttpHandler a un altro oggetto che gestisce effettivamente la richiesta. quindi nel metodo ProcessRequest di HttpHandler dovresti fare qualcosa del genere:

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

Ciao. Grazie per l'idea. Potrebbe essere la soluzione, una delle altre opzioni di Mauricio. Grazie! – Matt

Problemi correlati