webapi unity net mvc injection dependency container aspnet asp apicontroller asp.net-mvc dependency-injection structuremap

asp.net-mvc - net - unity dependency injection



Custom Controller Factory, problemas de Injection/Structuremap de ASP.NET MVC (2)

Supongo que está solicitando un archivo estático, como un archivo de 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.

Recientemente traté de implementar la inyección de dependencia usando 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.

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 una clase BootStrapper estática que registra todas mis dependencias, pero parece que GetControllerInstance de StructureMapControllerFactory recibe dos llamadas. 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 la segunda vez.

Aquí están mis bits Global.asax que pueden ser relevantes:

protected void Application_Start() { RegisterRoutes(RouteTable.Routes); Bootstrapper.ConfigureStructureMap(); ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory()); }

Tengo muchas ganas de que la inyección de dependencia funcione y agradecería mucho si alguien puede ayudarme. :)


ACTUALIZAR El motivo por el que esto sucede es que cuando se especifica una imagen en un archivo css y esa imagen falta, el marco de enrutamiento intenta asignar la url a 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 aquí .

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. Lo primero que haría es agregar 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 cuál es la solicitud que está causando que el controllerType sea nulo. En mi caso particular, tenía una imagen de fondo en mi archivo css configurado así:

background: url(img/logo.gif);

Entonces, lo que sucede es que el enrutamiento busca un controlador llamado "img" y una acción que toma logo.gif o algo similar. Obviamente, ese no es el comportamiento correcto.

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

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

Todavía no estoy seguro de por qué no necesitas hacer esto con ControllerFactory por defecto, pero no obstante funciona.

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

routes.IgnoreRoute("{*favicon}", new {favicon=@"(.*/)?favicon.ico(/.*)?"})