10

Esto puede ser una pregunta estúpida, pero estoy viendo las fuentes de Ninject y no veo a NInject registrando su propia fábrica de controladores. Tampoco veo ninguna clase IControllerFactory en el ensamblaje Ninject.Web.Mvc. ¿Me estoy perdiendo de algo? ¿Cómo crea Ninject el controlador e inyecta parámetros en el constructor?¿Cómo crea Ninject el controlador en ASP.NET MVC?

+0

Parece que mi aplicación sigue la misma lógica. Parece que no está registrando el controlador. –

Respuesta

11
  1. digamos que estamos buscando "/ Tareas/Índice".
  2. Las aplicaciones Ninject MVC usan ahora DefaultControllerFactory, lo mismo que las aplicaciones que no son Ninject.
  3. DefaultControllerFactory encuentra el tipo de controlador (TaskController).
  4. DefaultControllerFactory tiene clase interna llamada DefaultControllerActivator. DefaultControllerActivator tiene un método llamado Create, que devuelve la instancia del controlador. DefaultControllerFactory pregunta DefaultControllerActivator para TaskController tipo instancia.
  5. DefaultControllerActivator.Create utiliza IDependencyResolver. Aquí es donde entra Ninject. Dado que Ninject implementa su propio resolver y lo establece al inicio de la aplicación, obtiene una solicitud para la instancia TaskController.
  6. El resto es fácil. Ninject encuentra constructor para este tipo, inyecta parámetros, devuelve instancia de controlador.
4

MVC3 ahora recomienda el uso de la interfaz IDependencyResolver en lugar del antiguo IControllerFactory cuando se trata de DI. Puede ver más detalles de esta interfaz here.

This is the new Ninject class responsable de inyectar las dependencias.

0

Dado que los controladores son de tipo concreto, Ninject se autoajustable. A continuación se muestra un fragmento del ninject.complex.com

Tenga en cuenta que solo los tipos de concreto pueden ser autoalineables; los tipos e interfaces abstractos no funcionarán. Además, si solicita una instancia de un tipo que se pueda unir automáticamente y no haya enlaces definidos para el tipo , Ninject creará automáticamente un enlace automático implícito. Es depende de ti si quieres definir tus enlaces explícitamente, o deja que Ninject lo resuelva.

Si necesita insertar parámetros en el constructor. Puede crear una clase hereda de INinjectModule y hacer el enlace allí.

Cuestiones relacionadas