2009-04-05 14 views
27

Hace poco intenté implementar la inyección de dependencia utilizando StructureMap. Logré seguir el ejemplo hasta el final, pero me encuentro con una excepción lanzada cada vez que intento ejecutar la aplicación. Aquí hay algunos fragmentos de código de la fábrica de mi controlador.Controlador personalizado Fábrica, problemas de Inyección de Dependencia/Structuremap con ASP.NET MVC

public class StructureMapControllerFactory : DefaultControllerFactory 
{ 
    protected override IController GetControllerInstance(Type controllerType) 
    { 
     if (controllerType == null) 
      throw new ArgumentNullException("controllerType"); 

     return ObjectFactory.GetInstance(controllerType) as Controller; 
    } 
} 

Mi Global.asax llama a un programa previo de clase estática que registra todas mis dependencias pero parece que GetControllerInstance del StructureMapControllerFactory se está llamado dos veces. La primera vez que se invoca, se pasa un tipo de controlador apropiado pero siempre es nulo en la segunda llamada.

La primera vez que se llama a GetControllerInstance, el tipo se establece en HomeController que es correcto. El código se activa en HomeController y devuelve View(). A la vuelta de la Vista(), se llama al evento Page_Load en el archivo aspx. Después de pasar por eso, llega a una línea:

httpHandler.ProcessRequest (HttpContext.Current);

Ahí es donde se llama a GetControllerInstance por segunda vez.

Aquí está mi bits de Global.asax que pueden ser relevantes:

protected void Application_Start() 
    { 
     RegisterRoutes(RouteTable.Routes); 

     Bootstrapper.ConfigureStructureMap(); 

     ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory()); 
    } 

Estoy muy interesado en obtener la inyección de dependencias de trabajo y estaría muy agradecido si alguien me puede ayudar a cabo. :)

+1

Dude, estoy teniendo el EXACTO mismo problema. – Micah

+0

¿Cómo registras tus controladores? – Sebastian

+0

Buena descripción del problema. –

Respuesta

45

ACTUALIZACIÓN La razón de que esto está sucediendo es que cuando se especifica una imagen en un archivo CSS, y esa imagen le falta el marco de enrutamiento intenta trazar la ruta de un controlador. Ignorar las rutas que se enumeran a continuación evitará que ocurra el error, pero decidí no implementarlo porque es una buena forma de que se te notifique que tienes un recurso faltante.

Puede ver una explicación detallada junto con ejemplos de configuración de inyección de dependencia usando el Mapa de estructura here.

Estaba teniendo el mismo problema y creo que lo descubrí. Por alguna razón, siempre que intente proporcionar su propia fábrica de controladores, debe agregar un par de definiciones adicionales de IgnoreRoute. La primera cosa que hacer es añadir esta línea a su método GetControllerInstance:

if(controllerType == null) 
    return base.GetControllerInstance(controllerType) 

Esto al menos le dará más información en el mensaje de error en cuanto a lo que la petición es que está causando el controllerType a ser nulo. En mi caso particular tuve una imagen de fondo en mi archivo css establecido así:

background: url(img/logo.gif); 

Así que lo que sucede es el enrutamiento está buscando un controlador llamado "img" y una acción que se lleva a logo.gif o algo a lo largo esas líneas Obviamente, ese no es el comportamiento correcto.

Después de algunas excavaciones me di cuenta de que necesitaba agregar una definición de IgnoreRoute a mi Global.asax archivo que ignorar cualquier cosa en el directorio "contenido" de mi sitio como este:

routes.IgnoreRoute("{Content}/{*pathInfo}"); 

todavía no estoy seguro de por qué no es necesario hacer esto con la ControllerFactory por defecto, pero sin embargo funciona.

Probablemente se encuentre con el mismo problema con favicon.ico. Particularmente si usa google crhome. Necesitarás agregar esto también:

routes.IgnoreRoute("{*favicon}", new {[email protected]"(.*/)?favicon.ico(/.*)?"}) 
+0

gracias, esta es probablemente la razón, informaré cuando esté en casa – kitsune

+1

Estaba teniendo el mismo problema con un Windsor ControllerFactory. Gracias por la corrección, funciona genial. –

+0

+ 1 para fondo: url (img/logo.gif); Mi error fue que estaba usando JQuery UI y no había incluido los archivos de imagen. Solo estaba usando una pequeña pieza de funcionalidad y no me di cuenta de las imágenes que necesitaba ... ¡Woops! – ozz

4

Supongo que está solicitando un archivo estático, como un archivo javascript, que no se ha agregado a su proyecto o tal vez la referencia tiene un error tipográfico. Debe supervisar las solicitudes web de su navegador y buscar las solicitudes web que no se resuelven correctamente en un archivo estático cuando deberían. Puedes usar Firebug en FF o violín si estás usando IE para hacer esto.

Cuestiones relacionadas