2010-03-25 21 views
9

Acabo de presentar Archivo -> Nuevo proyecto anoche en un nuevo proyecto. Ah, el olor a campos verdes.Uso de ASP.NET MVC 2 con Ninject 2 desde cero

estoy usando el recién publicado ASP.NET MVC 2 (es decir, sin vista previa o liberar candidato, la cosa real), y pensé en bajar a un buen comienzo usando Ninject 2 (versión también liberado) con las extensiones MVC. I descargué el proyecto de extensiones MVC, lo abrí en VS2008Sp1, lo construí en modo de lanzamiento, y luego entré en la carpeta mvc2 \ build \ release y copié Ninject.dll y Ninject.Web.Mvc.dll desde allí al Carpeta de bibliotecas en mi proyecto (para que pueda arrastrarlos en el control de fuente y siempre tenga la versión correcta en todas partes). No incluí los archivos .xml correspondientes, ¿debería? ¿Simplemente proporcionan intellisense, o alguna otra función? No es un gran problema, creo.

Anyhoo, seguí el consejo más actualizado que pude encontrar; I hace referencia a las DLL en mi proyecto MVC2, luego fui a trabajar en Global.asax.cs. Primero lo hice heredar de NinjectHttpApplication. I eliminó el método Application_Start() y anuló OnApplicationStarted() en su lugar. Aquí es que el método:

protected override void OnApplicationStarted() 
{ 
    base.OnApplicationStarted(); 
    AreaRegistration.RegisterAllAreas(); 
    RegisterRoutes(RouteTable.Routes); 
    // RegisterAllControllersIn(Assembly.GetExecutingAssembly()); 
} 

Y también he seguido el consejo de VS e implementado el método CreateKernel :

protected override Ninject.IKernel CreateKernel() 
{ 
    // RegisterAllControllersIn(Assembly.GetExecutingAssembly()); 
    return new StandardKernel(); 
} 

Eso es todo. No hay otras modificaciones al proyecto.

Observará que el método RegisterAllControllersIn() se comenta en dos lugares anteriores. He pensado que puedo ejecutarlo en tres combinaciones diferentes de , todas con sus efectos secundarios originales;

  • Ejecutarlo como arriba.

Me presentan la página estándar "Bienvenido a ASP.NET MVC" en toda su 'gloria. Sin embargo, después de que esta página se muestre correctamente en el navegador , VS me muestra una excepción que se lanzó. Lanza en NinjectControllerFactory.GetControllerInstance(), que se llamó con un valor NULL en el parámetro controllerType. Observe que este ocurre después de que se renderiza la página/Home - No tengo idea de por qué se llama de nuevo y mediante el uso de puntos de interrupción ya he determinado que GetControllerInstance() se ha llamado con éxito para el HomeController . ¿Por qué esta nueva llamada con controllerType como null? I realmente no tengo idea. Presionando F5 en este momento me lleva de vuelta al buscador , no hay quejas allí.

  • Uncommenting el método RegisterAllControllersIn() en CreateKernel()

Aquí es donde la materia está empezando a conseguir enrrollados. Ahora recibo un error 404 .Algunas veces también he recibido una ArgumentNullException en la línea RegisterAllControllersIn(), pero eso es bastante raro, y no he podido reproducirlo en .

  • Uncommenting los RegisterAllControllers método() en OnApplicationStarted()

(Y poner el comentario de nuevo en la de CreateKernel())

resulta en un comportamiento que parece exactamente igual que en punto 1.

Para que no se pierda para siempre, existe una guía exacta paso a paso sobre cómo configurar un proyecto MVC 2 con Ninject 2 (ambos no beta versiones de lanzamiento) para obtener los controladores proporcionados por Ninject? Del curso , comenzaré a proporcionar algunas cosas reales para la inyección (como objetos y repositorios de ISession, registradores, etc.), pero pensé que Primero conseguiría esto.

¡Cualquier ayuda será muy apreciada!

(también publicado en el grupo de Google Ninject)

+0

Esto está en el proceso de ser arreglado por los chicos de Ninject. ¡Más cuando tengo mi cabeza alrededor de todo! –

+0

¿Por qué no registra ningún módulo como en http://github.com/enkari/ninject.web.mvc (readme.markdown)? (He visto el hilo en http://groups.google.com/group/ninject/browse_thread/thread/c011f0bd83993a59)? –

+0

Hola, La razón por la que no hay módulos es que se trata de un proyecto virgen, y los repositorios y otras cosas que se inyectarán aún no existen. Lo primero que hice después de configurar el proyecto MVC fue básicamente agregar Ninject 2 a la mezcla, para asegurarme de que la inyección del controlador funcionó, y no fue así. Entonces esa es mi razón :) –

Respuesta

10

me siento sucia responder a mi propia pregunta, pero en beneficio de cualquier persona que pudiera pasear en este ...

Esto no es un problema Ninject, en realidad, parece ser un problema con Cassini (el servidor web integrado en VS2k8), que maneja estas solicitudes de forma diferente a como lo haría IIS. La razón básica es que la aplicación recibe una solicitud de favicon.ico, que Cassini envía a MVC, y Ninject no sabía cómo manejarlo.

Ian Davis tuvo una solución de error para esto en un tiempo impresionantemente corto, y también recomendó agregar una ruta de ignorar para evitar este problema específicamente mientras hacía el desarrollo. Simplemente agregue lo siguiente a su configuración de ruta:

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

Espero que esto ayude a alguien!