He instalado el mvc4 rc actualización y estoy tratando de construir una api de la aplicación con un poco de suerte.

Estoy usando ninject, pero no puedo obtener mi controladores de carga. Sigo recibiendo un error

Tipo De Api.Los controladores.ConsumerController’ no tiene un constructor predeterminado

Soy muy nuevo en mvc y el uso de la inyección, así que por favor tengan paciencia conmigo.

No he hecho nada especial para el enlace predeterminado que se crea a través de nuget

 public static class NinjectWebCommon 
{
    private static readonly Bootstrapper bootstrapper = new Bootstrapper();

    ///<summary>
    ///Starts the application
    ///</summary>
    public static void Start() 
    {
        DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
        DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
        bootstrapper.Initialize(CreateKernel);
    }

    ///<summary>
    ///Stops the application.
    ///</summary>
    public static void Stop()
    {
        bootstrapper.ShutDown();
    }

    ///<summary>
    ///Creates the kernel that will manage your application.
    ///</summary>
    ///<returns>The created kernel.</returns>
    private static IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
        kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

        RegisterServices(kernel);
        return kernel;
    }

    ///<summary>
    ///Load your modules or register your services here!
    ///</summary>
    ///<param name="kernel">The kernel.</param>
    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<IConsumerRepository>().To<ConsumerRepository>();
    }        
}

Mi controlador parece

   private readonly IConsumerRepository _repository;

    public ConsumerController(IConsumerRepository repository)
    {
        _repository = repository;
    }

    [HttpGet]
    public IQueryable<Consumer> Get(Guid id)
    {
        return _repository.Get(id).AsQueryable();
    }

¿Qué debo hacer para obtener la api de controladores para trabajar con ninject?

Lo siento si esto es cosas simples

He probado tu sugerencia Michael sin embargo después de cambiar el webcommon.cs a este

  private static IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
        kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

        RegisterServices(kernel);
        GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);
        return kernel;
    }

    ///<summary>
    ///Load your modules or register your services here!
    ///</summary>
    ///<param name="kernel">The kernel.</param>
    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<IConsumerRepository>().To<ConsumerRepository>();
    }

Me sale un error cuando

var kernel = new StandardKernel();

se llama

Método ‘GetFilters» en el tipo ‘Ninject.Web.WebApi.El filtro.DefaultFilterProvider’ de la asamblea ‘Ninject.Web.WebApi, Version=3.0.0.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7’ no tiene una implementación.

Lo que me estoy perdiendo?

InformationsquelleAutor Diver Dan | 2012-06-01

11 Comentarios

  1. 60

    Me preguntó Brad Wilson acerca de esto y no ha cambiado en MVC4 RC.

    GlobalConfiguration.De configuración.ServiceResolver ha sido trasladado a GlobalConfiguration.De configuración.DependencyResolver

    Utilizar esta aplicación para crear una Ninject DependencyResolver para su Api Web:
    https://gist.github.com/2417226

    En NinjectWebCommon.cs:

    //Register Dependencies
    RegisterServices(kernel);
    
    //Set Web API Resolver
    GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);
    • Hola Michael cuando puedo usar tu sugerencia me sale un error del Método ‘GetFilters» en el tipo ‘Ninject.Web.WebApi.El filtro.DefaultFilterProvider’ de la asamblea ‘Ninject.Web.WebApi, Version=3.0.0.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7 » no dispone de una aplicación.
    • He quitado la referencia a webapi y parece tener resolvió.
    • Creo que usted está usando un Ninject plugin que es para una versión anterior de WebApi. Quitar esa referencia y sólo el uso de paquetes de Nuget Ninject, Ninject.Web.Común y Ninject.MVC3 (Aún trabaja para MVC4)
    • Yo estaba experimentando el mismo problema y se retira el ninject de la web.referencia de la api como usted dijo. Ahora funciona!
    • Gracias – he tenido una ejecución en todo, pero esto funciona para mí
    • He probado esto, pero voy a poner el «No constructor sin parámetros definidos para este objeto.» error. También he actualizado desde MVC 3, así que tal vez me perdí de algo más…
    • Tenía que seguir los pasos en strathweb.com/2012/05/…, que incluye el paso en esta respuesta.
    • He estado buscando esta respuesta durante tanto tiempo, gran trabajo! Estoy sorprendido no actualizar el paquete de nuget para incluir este….

  2. 6

    Este mensaje de error genérico

    Tipo De Api.Los controladores.ConsumerController’ no tiene un constructor predeterminado

    también puede ocurrir si usted no hace el constructor público, o de la dependencia no puede ser resuelto por el contenedor de IoC tal vez debido a una falta de argumento.

    El mensaje de error es engañoso decir lo menos.

    • Tan sencilla, pero el constructor privado era mi problema y me estaba mirando todo, pero yo no podía ver, tu sugerencia me salvó otro día.
    • Yo tenía un constructor en la que se pidió una interfaz, que estaba destinado a una clase que se solicitó una nueva interfaz que la interfaz no tiene un enlace y en lugar de dejarme saber que – se acaba de decir que el ApiController no tiene un constructor predeterminado – comprobar que tu dependencias están registrados si usted consigue esto.
  3. 6

    Puede instalar el paquete de NuGet WebApiContrib.Coi.Ninject y agregue la siguiente línea de código para NinjectWebCommon.cs

    GlobalConfiguration.Configuration.DependencyResolver = new NinjectResolver(kernel);
    • Esto funcionó para mí! Gracias… También asegúrese de establecer los enlaces en su NinjectWebCommon.cs archivo 🙂
  4. 1

    Para alguien de aterrizar aquí, mientras que la búsqueda ‘…no tiene un constructor predeterminado’ buscando una manera fácil de depurar silencio fallando configuraciones:

    1. Quitar constructor de inyección de objetos hasta que el constructor puede ser invocada
    2. Para cada uno de los previamente inyectados, ahora sin inicializar objetos, invocar el uso de:

    ServiceLocator.Current.GetInstance<[OBJ-TYPE]>()

    El objeto infractor causará un ActivationException con un Mensaje descriptivo. Usted tendrá algo para ir.

    Recuerde quitar llamada a ServiceLocator post-fix. Es decir. este es no una recomendación para usar el servicio de localizador de anti patrón fuera de la depuración.

  5. 0

    se ha registrado el recipiente con el frawework? Yo prefiero usar autofac, aquí es un ejemplo de cómo utilizar autofac con la API. http://alexmg.com/post/2012/03/08/Autofac-ASPNET-Web-API-%28Beta%29-Integration.aspx

    También, Marca Seeman tiene un buen puesto en DI, en general, con WebAPI

    http://blog.ploeh.dk/2012/03/20/RobustDIWithTheASPNETWebAPI.aspx

    De Ploeh:

    GlobalConfiguration.Configuration.ServiceResolver.SetResolver(
        t => this.container.Kernel.HasComponent(t) ?
            this.container.Resolve(t) :
            null,
        t => this.container.ResolveAll(t).Cast<object>());

    El de arriba tiene que ser hecho en el mundial.asax

  6. 0

    Esperemos que esto ayude a alguien más…

    Yo estaba teniendo el mismo problema y estaba relacionado con me mueve la clase responsable del registro de la asamblea a cargo de la inicialización de los controladores. Se trasladó fuera de la web en el marco del proyecto.

    Utilizando Autofac, pero con el mismo aplicaría para otros contenedores.

    Estaba llamando:

    builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

    Que funciona bien cuando es dentro de la aplicación web, pero la tiró por encima de la excepción cuando se trasladó a marco del proyecto como de la ejecución de la asamblea ya no contiene los controladores.

    Lugar de actualización:

    builder.RegisterApiControllers(Assembly.GetCallingAssembly());
  7. 0

    Parece Ninject no lanzar una excepción, ya que, generalmente, cuando el COI dependencias no son muy de configurar la derecha. En lugar de eso parecía que no me había registrado el WebAPI de dependencia resolución de que yo lo hice. Aquí fue mi solución a este problema, pero de lo que he encontrado puede ser de MUCHOS tipos DIFERENTES de problemas de instalación. Acabo de volver a comprobar todo lo que en la cadena de dependencias. Espero que ayude a alguien!

    El controlador:

    public class ContestsController : ApiController
    {
        //Ninject wouldn't inject this CTOR argument resulting in the error
        public ContestsController(IContestEntryService contestEntryService)
        {

    La dependencia:

    public class ContestEntryService : IContestEntryService
    {
    
        public ContestEntryService(IContestsContext contestsContext)
        {

    La configuración incorrecta:

        private static void RegisterServices(IKernel kernel)
        {
            kernel.Bind<IContestsContext>()
                  .To<ContestsContext>()
                  .InRequestScope();
    
            kernel.Bind(x =>
                x.FromAssembliesMatching("MyNameSpace.*")
                 .SelectAllClasses()
                 .BindAllInterfaces()
             );

    La configuración correcta:

        private static void RegisterServices(IKernel kernel)
        {
             kernel.Bind(x =>
                x.FromAssembliesMatching("MyNameSpace.*")
                 .SelectAllClasses()
                 .BindAllInterfaces()
             );
    
             kernel.ReBind<IContestsContext>()
                  .To<ContestsContext>()
                  .InRequestScope();

    Generalmente Ninject es bastante bueno, sobre la denuncia de este tipo de errores, así que realmente tengo lanzado por un bucle en este!

  8. 0

    si alguno alguien sigue teniendo problemas, por favor, escuchen, por alguna razón, ninject no está funcionando cómo esperamos con mvc 4. En su web api, usted necesita escribir el código

    public DefaultController() : base() { }  

    Esto elimina el error diciendo acerca de que ningún constructor predeterminado, entonces cuando usted necesita para obtener sus datos desde el método de escribir este código:

    public IEnumerable<YourModelGoesHere> Get() 
    {
        return context.YourData;  
    } 

    Mantener en mente, usted tendrá acceso a su db clase aquí, por ejemplo:

    DefaultConnection context = new DefaultConnection(); 
  9. 0

    Tuve este mensaje de error, demasiado, pero resultó que uno de mis interfaces de hecho no fueron implementadas por las clases (se me olvidó añadir a la declaración de la clase).

Dejar respuesta

Please enter your comment!
Please enter your name here