6

Me encontré con un problema bastante peludo. ¡Probablemente haya una solución simple para esto, pero no puedo encontrarlo!Construtor/Setter Injection usando IoC en HttpHandler, ¿es posible?

Tengo un HttpHandler personalizado que quiero procesar una solicitud, registro cierta información y luego ingreso los detalles en la base de datos. Estoy usando NUnit y Castle Windsor.

Así que tengo dos interfaces; uno para registrar el otro para la entrada de datos, que son inyectores construidos. Descubrí rápidamente que no hay forma de llamar al constructor ya que siempre se llama al constructor sin parámetros predeterminado.

Así que pensé que usaría inyección de Setter y dejaría que Castle windsor lo resolviera. Esto realmente funciona, como cuando uso container.Resolve<CustomHttpHandler>();, puedo verificar que el registrador no sea nulo. (En Application_Start en Global.asax.cs)

El problema es que aunque Castle Windsor puede crear la instancia que la aplicación http no está usando ??? ¿¿Creo??

Básicamente, la razón para hacerlo de esta manera era poder probar el logger y el código del repositorio de datos de forma aislada a través de burlas y pruebas de unidades.

¿Alguna idea de cómo puedo solucionar este problema?

Gracias!

+0

Matt, no está bien cambiar tu pregunta así porque invalidas todas las respuestas existentes y obligas a todos a actualizar. Por favor, invierta su edición y cree una nueva pregunta. –

+0

Hola Mauricio. Lo siento, obviamente soy nuevo en cómo funciona esto. Han revertido y creado una nueva pregunta. ¡Gracias! – Matt

Respuesta

2

No es posible, al menos no directamente. Los objetos IHttpHandler son instanciados por el tiempo de ejecución de ASP.NET y no permite que Windsor se involucre en su creación. Puede:

  • Depende de las dependencias, utilizando el contenedor como un localizador de servicios.
  • configurar un manejador de base que crea, inyecta y delegados a sus propios controladores (ver cómo Spring does it)
  • uso del contenedor como un localizador de servicios para otro servicio que se encarga de toda la solicitud (como saret explained)
+0

Dang, tenía la sensación de que podría ser el caso. ¿Podría explicar un poco su primer punto: establecer dependencias, utilizando el contenedor como un localizador de servicios? ¡Gracias! – Matt

+0

@Matt: desde su HttpHandler, llame al contenedor para buscar las dependencias que necesite. –

+0

Gracias por la respuesta Mauricio. ¡Entendido! – Matt

2

Lo que podría hacer es hacer que HttpHandler llame a otro objeto que realmente maneja la solicitud. por lo que en el método ProcessRequest de su HttpHandler que haría algo como esto:

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

Hola. Gracias por la idea Podría ser la solución, una de las otras opciones de Mauricio. ¡Gracias! – Matt

Cuestiones relacionadas