2010-02-11 12 views
6

estoy utilizando: -¿Cómo consigo ninject 2.0 trabajando con asp.net mvc 2?

  1. rc asp.net mvc 2
  2. Ninject y asp.net mvc ninject extensión (http://github.com/enkari/ninject.web.mvc)

me siguen dando el 'No constructor sin parámetros definidos para este objeto.' para mi AccountController. El AccountController está inyectado con Servicios. Los enlaces para estos servicios se definen en el ServiceModule.

Busque a continuación el código para mi aplicación Mvc en Global.asax.cs.

public class MvcApplication : NinjectHttpApplication // System.Web.HttpApplication 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Account", action = "Login", id = "" } // Parameter defaults 
     ); 

    } 

    protected override void OnApplicationStarted() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterRoutes(RouteTable.Routes); 

     RegisterAllControllersIn(Assembly.GetExecutingAssembly()); 
    } 

    protected override IKernel CreateKernel() 
    { 
     return new StandardKernel(new INinjectModule[] { 
      new ServiceModule(), 
     }); 
    } 
} 
+0

son otros controladores que trabajan? ¿Construiste el proyecto Ninject.Web.Mvc contra ASP.NET MVC 2 RC 2? – Charlino

+0

@Charlino. Gracias que funcionó. –

Respuesta

7

Reconstruyendo el Ninject.Web.Mvc contra el ASP.Net MVC 2 dlls resolvió el problema. El problema es con la clase NinjectControllerFactory. La firma del método para obtener la instancia de controlador ha cambiado en MVC 2.

IController GetControllerInstance(Type controllerType) 

Para

IController GetControllerInstance(
     RequestContext requestContext, Type controllerType) 

hacer los cambios necesarios y reconstruir la extensión Ninject MVC y todo funciona bien. Gracias a @Charlino por la sugerencia.

+1

Bueno para escuchar. ¡Destripado, no lo convertí en una respuesta y obtuve los puntos! ;-) – Charlino

-1

En Ninject, se supone que no debes anular el método Application_Start. Si necesita hacer cosas que no son automáticas (como registrar áreas, no sé si Ninject también lo hace por usted), asegúrese de llamar al base.OnApplicationStarted() para ejecutar todas las cosas específicas de Ninject. correctamente.

protected override void OnApplicationStarted() 
{ 
    base.OnApplicationStarted(); 

    // Kick some butt here 
} 
+0

Según lo que veo en el archivo 'NinjectHttpApplication.cs', la función está vacía. Estoy de acuerdo en que debería hacerlo de la forma en que dijiste (porque es virtual), pero eso no resuelve mi problema. –

-1

El código es correcto excepto por la coma después de 'nuevo ServiceModule()'.

Debe estar en Global.asax.cs, no en Global.aspx.cs.

+0

Editado el nombre del archivo en la pregunta. Fue un error de tipeo. La coma no importa. está escribiendo sintaxis –

1

Por alguna razón, he encontrado que si su global.asax.cs hereda de NinjectHttpApplication OnApplicationStarted() no se llama. Cambie su OnApplicationStarted() para anular Init(), y debería funcionar.

ver más abajo:

public class MvcApplication : NinjectHttpApplication // System.Web.HttpApplication 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Account", action = "Login", id = "" } // Parameter defaults 
     ); 

    } 

    public override void Init() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterRoutes(RouteTable.Routes); 

     RegisterAllControllersIn(Assembly.GetExecutingAssembly()); 
    } 

    protected override IKernel CreateKernel() 
    { 
     return new StandardKernel(new INinjectModule[] { 
      new ServiceModule(), 
     }); 
    } 
} 
Cuestiones relacionadas