ASP.NET MVC 4 + Ninject MVC 3 = Ningún constructor sin parámetros definido para este objeto

ACTUALIZACIÓN – Consulte mi respuesta para obtener un enlace y una explicación de la solución a este problema

Antes de comenzar, sé que esta es una pregunta muy común y he estado usando Ninject durante muchas lunas sin problemas, pero ahora ha surgido y no puedo encontrar una solución. Además, no, ninguno de los resultados en Google y SO hasta ahora me han ayudado.

Por lo tanto, considere la siguiente parte del código que se ejecuta en un prototipo muy, muy, muy simple proyecto ASP.NET MVC 4 de Visual Studio 2012 en Windows Server 2008 R2:

public class DefaultController : Controller { private IGroupPrincipalRepository GroupPrincipalRepository { get; set; } [Inject] public DefaultController( IGroupPrincipalRepository groupPrincipalRepository) { this.GroupPrincipalRepository = groupPrincipalRepository; } } 

Y aquí está el método de NinjectWebCommon.cs RegisterServices :

 kernel.Bind(typeof(IGroupPrincipalRepository)).ToConstructor( c => new GroupPrincipalRepository(new PrincipalContext(ContextType.Domain, "?", "?", "?", "?"))).InSingletonScope(); 

Ahora, así es como funcionan mis otros proyectos que usan Ninject (pero son ASP.NET MVC 3 en .NET 4) y, hasta donde sé, esto es lo que se necesita para que todo funcione. Entonces, ¿por qué de repente estoy obteniendo un constructor sin parámetros definido para este objeto? excepciones?

ACTUALIZAR

Aquí está el archivo completo NinjectWebCommon.cs :

 [assembly: WebActivator.PreApplicationStartMethod(typeof(App_Start.NinjectWebCommon), "Start")] [assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(App_Start.NinjectWebCommon), "Stop")] namespace App_Start { using System; using System.DirectoryServices.AccountManagement; using System.Repositories.ActiveDirectory; using System.Web; using Microsoft.Web.Infrastructure.DynamicModuleHelper; using Ninject; using Ninject.Web.Common; public static class NinjectWebCommon { private static readonly Bootstrapper bootstrapper = new Bootstrapper(); public static void Start() { DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); bootstrapper.Initialize(CreateKernel); } public static void Stop() { bootstrapper.ShutDown(); } private static IKernel CreateKernel() { var kernel = new StandardKernel(); kernel.Bind<Func>().ToMethod(ctx => () => new Bootstrapper().Kernel); kernel.Bind().To(); RegisterServices(kernel); return kernel; } private static void RegisterServices( IKernel kernel) { kernel.Bind(typeof(IGroupPrincipalRepository)).ToConstructor( c => new GroupPrincipalRepository(new PrincipalContext(ContextType.Domain, "", "", "", ""))).InSingletonScope(); } } } 

ACTUALIZACIÓN – Consulte mi respuesta para obtener un enlace y una explicación de la solución a este problema

Sé que esta es una vieja pregunta, pero parece que no hay ninguna respuesta real y he solucionado el problema así que aquí está mi solución:

Crear una fábrica de controlador personalizado:

 public class NinjectControllerFactory : DefaultControllerFactory { private IKernel ninjectKernel; public NinjectControllerFactory(IKernel kernel) { ninjectKernel = kernel; } protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) { return (controllerType == null) ? null : (IController) ninjectKernel.Get(controllerType); } } 

Luego, si está utilizando NinjectHttpApplication, agregue la siguiente línea a OnApplicationStarted:

 ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory(Kernel)); 

Si no está utilizando NinjectHttpApplication, agregue esa línea en algún lugar después de haber creado su kernel y pasarle una referencia a su kernel recién creado.

Eso es.

Bueno, no tengo una respuesta exacta de por qué está apareciendo el error, pero sé quién lo está causando y eso es Visual Studio 2012. Instalé Visual Studio 2010 en la misma máquina que 2012, instalé ASP.NET MVC 4 para 2010 y recreé el proyecto 2012 en 2010 palabra por palabra, carta por carta. El resultado final es que cuando 2010 depura el proyecto todo funciona bien y Ninject inyecta las dependencias como debería.

Cuando 2012 depura su proyecto, acaba apareciendo con el No parameterless constructor defined for this object excepción de No parameterless constructor defined for this object . Reorientación entre .NET 4.0 y .NET 4.5 en 2012 no hace nada. La reinstalación de Ninject de NuGet tampoco hace nada. Incluso configuré proyectos 2010 y 2012 para usar el servidor IIS local para estar absolutamente seguro y el resultado final es el mismo.

Voy a suponer que hay un error con Visual Studio 2012 o con Ninject. La única diferencia que tengo entre los dos proyectos es de qué IDE están ejecutando y el proyecto de 2012 es el que está fallando, por eso estoy apuntando con el dedo a Visual Studio 2012.

ACTUALIZAR

Chicos. ¡CHICOS! Me encontré con este problema OTRA VEZ, y encontré la solución en otra pregunta SO: Ninject + MVC3 no está inyectando en el controlador .

Básicamente, esto es lo que falta en el Web.config que lo hace funcionar:

     

Supongo que esto obliga al framework a estar al tanto de los contenedores de IoC que permiten que Ninject finalmente pueda enlazarse. Aunque no puedo evitar pensar que el paquete Ninject NuGet debe buscar la existencia de esa redirección de enlace en Web.config y agregarla automáticamente. Seguro que ayudaría con una gran cantidad de tirones de cabello que suceden sobre este tema.

PS Up: ¡vota por los mocos de esa publicación que vinculé porque se lo merece!

No reinvente la rueda y simplemente intente Install-Package Ninject.MVC3

Recibí el mismo mensaje de error después de obtener el MVC3 de NuGet.
No sé si obtuviste la configuración de tu proyecto de la misma manera que yo, pero mi web.config se genera automáticamente en función del entorno. El MVC de NuGet está agregando rows () al web.config y esas filas se eliminaron porque mis archivos de configuración de fusión no se configuraron correctamente.

Saludos,

Kim

¡Aquí hay una solución sucia! Pon esto

 var type = typeof(Ninject.Web.Mvc.MvcModule); 

al comienzo del evento AppStart (o en cualquier otro lugar)

Ahora déjame explicarte qué significa si alguien no consiguió un truco todavía. La cosa es que nuestra clase de aplicación http podría residir en cualquier lugar de la solución. No solo en la aplicación web. Y esto es muy importante porque la rutina de comstackción asp.net es diferente de las aplicaciones de biblioteca habituales. Carga ansiosamente TODAS las bibliotecas a las que se hace referencia mediante el ayudante de BuildManager, mientras que clr no carga los tipos desde el inicio a menos que se utilicen directamente.

Ahora volvamos a nuestra situación: Ninject.Web.Mvc funciona como un complemento dynamic, que no requiere ninguna mención dentro de un código. Y, por lo tanto, no se carga si se hizo referencia dentro de la biblioteca de clases que conduce a la inicialización de Mvc.Dependancy.

El problema parece ocurrir cuando uno usa Visual Studio 2012/2013 con ASP.NET 4.0 / 4.5. La versión de System.Web.Mvc se estableció en 4.0.0.0 en el archivo Web.config . No funcionó.

Mi solución fue

  1. eliminar NinjectWebCommon.cs
  2. copiar la clase NinjectControllerFactory Dere Jone en el proyecto:

     public class NinjectControllerFactory : DefaultControllerFactory { private IKernel ninjectKernel; public NinjectControllerFactory(IKernel kernel) { ninjectKernel = kernel; } protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) { return (controllerType == null) ? null : (IController) ninjectKernel.Get(controllerType); } } 
  3. cambie el contenido de Global.asax a:

     public class MvcApplication : NinjectHttpApplication { protected override IKernel CreateKernel() { IKernel kernel = new StandardKernel(); // kernel.Load(Assembly.GetExecutingAssembly()); // kernel.Bind().To(); return kernel; } protected override void OnApplicationStarted() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory(Kernel)); } } 

    después de eso tus inyecciones deberían funcionar.

Todo es ridículo, cambié a Autofac, cansado de nunca poder agregar Ninject a un proyecto con éxito. Web API, MVC4, MVC5 todos tuvieron problemas.

Para las personas MVC5, que usan Ninject MVC3, agregue lo siguiente al nivel de la aplicación web.config:

                  

Estuve tirando de mi cabello sobre esto durante varias horas en un proyecto reciente en el que pasé de MVC 3 a MVC 4. Con la falta de respuestas puntuales, pensé que tenía que ser algo que hice, ya que parece que el nuget Ninject.MVC3 El paquete funcionará bien con MVC 4, y de hecho lo hace.

En mi caso, no estaba actualizando completamente el proyecto MVC3. Después de seguir esta guía, hice que las cosas funcionaran como esperaba. Creo que me faltaba una redirección de encuadernación ensamblada.

Entonces, si estás actualizando un proyecto de MVC 3 a MVC 4, usando Ninject y obteniendo el error definido por el constructor sin parámetros, espero que esto ayude.

Como todos los carteles anteriores han declarado, esto me causó algunas canas. En mi caso, había “optimizado” demasiado mis referencias. Ninject. * Las cosas estaban allí pero se habían destrozado. Eliminé todas las referencias y limpié paquetes.conf manualli y agregué los paquetes nuevamente – ¡victoria!

Tengo el mismo problema y lo único que funciona para mí es cambiar el “Servidor web IIS local” en las propiedades del proyecto web a “Usar el Servidor de desarrollo Visual Studio”.

enter image description here

No sé por qué, pero cuando hago esto, mi punto de quiebre en NinjectWebCommon es hited. Al igual que @Alex dijo, es algo con Visual Studio 2012 no lo suficientemente shiny como para ejecutar el código en NinjectWebCommon cada vez que construyes tu aplicación. También es posible que no sea lo suficientemente inteligente como para entender cómo funciona bajo el capó.

No me gusta mi solución porque preferiría usar mi servidor web IIS local, pero por el momento, tengo una aplicación para crear y me llevó mucho tiempo con esta $%? !! / error … característica … no estoy seguro .

Esto fue resuelto por mí agregando una referencia a través de Nuget a Ninject.Web.MVC.

Intenté todas estas soluciones, pero ninguna funcionó.

Así es como lo resolví: eliminé todos mis archivos temp asp.net. Después de hacer esto, obtuve nuevos errores de configuración. Los arreglé Apareció el último y verdadero error: el nuevo Bootstrapper () intentaba cargar una versión anterior de un dll de ninject. Se eliminaron todos los paquetes de ninject. Instalados ninject paquetes nuget uno por uno, asegúrese de que la versión correcta esté instalada.

Intenté configurar Ninject con MVC 5. Finalmente, primero tuve que usar la solución con la fábrica de controladores y la solución con la redirección de enlaces. Después de eso, todo funciona como se esperaba. Se utilizó el servidor IIS local.

Pude resolver este problema en un proyecto web MVC5 al eliminar una directiva #if #endif del constructor de mis controladores.

Acceso directo a todo esto: Descarga uno de los siguientes Nuget Pacakges:

  • Ninject.MVC3
  • Ninject.MVC5

Eso se encargará de la unión que necesita.

Arreglé el mío eliminando Ninject MVC5 e instalando Ninject MVC3, de Nuget.

 MVC5 == Ninject.MVC5 MVC4 == Ninject.MVC3 MVC3 == Ninject.MVC3 

Consulte la versión de System.Web.MVC en las referencias para asegurarse de la versión de MVC en la que se encuentra actualmente.

Estaba recibiendo este problema, pero solo en las llamadas al servicio web. Encontré mi solución en esta respuesta https://stackoverflow.com/a/12379938/129580 a continuación es el código de muestra proporcionado

 public class Service : WebService { public IContextProvider ContextProvider {get;set;} public Service() { ContextProvider = DependencyResolver.Current.GetService(); } } 

que luego terminé convirtiéndome en, espero que esto ayude …

 ///  /// Summary description for PartMarking ///  [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. [System.Web.Script.Services.ScriptService] public class PartMarking : System.Web.Services.WebService { private readonly IUnitOfWork _unitOfWork; public PartMarking() { _unitOfWork = DependencyResolver.Current.GetService(); } [WebMethod] public DataSet GetParentConfigurations(string engineModel, string componentCode) { var results = _unitOfWork.PartMarking.GetParentSicMarkings(engineModel, componentCode); return results; } }