He creado un nuevo MVC5 proyecto con Web API 2, me, a continuación, agrega el Ninject.MVC3 paquete de NuGet.

Inyección de Constructor está trabajando muy bien para el MVC5 controladores, pero estoy recibiendo un mensaje de error al intentar usarlo con la API Web de Controladores.

Se ha producido un error al intentar crear un controlador de tipo ‘UserProfileController’. Asegúrese de que el controlador tiene un constructor público sin parámetros.

Constructor para trabajar MVC5 controlador:

public class HomeController : Controller
{
    private IMailService _mail;
    private IRepository _repo;

    public HomeController(IMailService mail, IRepository repo)
    {
        _mail = mail;
        _repo = repo;
    }
}

Constructor para que no trabajan en la Web de la API de Controlador:

public class UserProfileController : ApiController
{
    private IRepository _repo;

    public UserProfileController(IRepository repo)
    {
        _repo = repo;
    }
}

A continuación es la plena NinjectWebCommon.cs archivo:

[assembly: WebActivator.PreApplicationStartMethod(typeof(DatingSite.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(DatingSite.App_Start.NinjectWebCommon), "Stop")]
namespace DatingSite.App_Start
{
using System;
using System.Web;
using Microsoft.Web.Infrastructure.DynamicModuleHelper;
using Ninject;
using Ninject.Web.Common;
using DatingSite.Services;
using DatingSite.Data;
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)
{
#if DEBUG
kernel.Bind<IMailService>().To<MockMailService>().InRequestScope();
#else
kernel.Bind<IMailService>().To<MailService>().InRequestScope();
#endif
kernel.Bind<SiteContext>().To<SiteContext>().InRequestScope();
kernel.Bind<IRepository>().To<Repository>().InRequestScope();
}
}
}
  • El mensaje significa que la inyección no está registrado correctamente para WebAPI. Sospecho algo como esto puede ser necesaria para MVC5 demasiado.
  • Sospecho que la misma cosa, ¿sabe usted lo que debo hacer, para registrar este?
  • Joachim link le dice lo que debe ser hecho, la única diferencia que yo veo en CreateKernel es que usted no tiene esta línea: GlobalConfiguration.De configuración.DependencyResolver = new NinjectDependencyResolver(kernel);
  • Yo creo que usted me puede ayudar con este problema si usted tiene 30 segundos… Thks un montón! stackoverflow.com/questions/22401403/…
InformationsquelleAutor Declan | 2013-12-15

7 Comentarios

  1. 103

    La Ninject.Web.WebApi NuGet paquete ha sido puesto en libertad. A partir de ahora, la mejor solución es el uso de ese paquete.
    No podía encontrar ninguna documentación relacionada, pero después de instalar el paquete de todo lo que ha trabajado para mí.

    Install-Package Ninject.Web.WebApi 
    

    Después de la instalación, tanto en la normal de MVC y de la API instancias de controlador son proporcionados por Ninject.

    Si usted tiene Ninject.Web.Común ya instalado, asegúrese de guardar los enlaces de NinjectWebCommon.cs y dejar de Nuget reescribir NinjectWebCommon.cs durante la instalación y volver a poner los enlaces cuando haya terminado.

    Como se señaló en los comentarios dependiendo de su contexto de ejecución que se necesitan una de los siguientes paquetes:

    • Ninject.Web.WebApi.WebHost
    • Ninject.Web.WebApi.OwinHost
    • Ninject.Web.WebApi.Selfhost

    El escenario más común es el IIS para que elegir el servicio de hosting paquete.

    En el caso de iniciar un IIS MVC5 aplicación web desde cero y desea utilizar Ninject instalar los siguientes paquetes:

    • Ninject – Ninject core dll
    • Ninject.Web.Común – Común funcionalidad de una página Web para Ninject, por ejemplo. InRequestScope()
    • Ninject.MVC5 – MVC dependencia de los inyectores, por ejemplo. para proporcionar los Controladores MVC
    • Ninject.Web.Común.Proveedor de alojamiento web – los Registros de la dependencia de los inyectores de Ninject.MVC5 cuando IIS se inicia la aplicación web. Si usted no está utilizando IIS usted necesitará un paquete diferente, una marca de verificación
    • Ninject.Web.WebApi WebApi dependencia de los inyectores, por ejemplo. para proporcionar los Controladores para WebApi
    • Ninject.web.WebApi.Proveedor de alojamiento web – los Registros de la dependencia de los inyectores de Ninject.Web.WebApi cuando IIS se inicia la aplicación web.
    • Esto para llegar a jugar muy bien con IIS lo necesario para instalar Ninject.Web.WebApi.Proveedor de alojamiento web. Esto proporcionó WebActivatorEx y NinjectWebCommon que parece necesario para un nuevo WebApi proyecto.
    • no funciona para mí.
    • Podemos utilizar MVC web & WebAPI en el mismo proyecto?
    • Esto no le pedirá sobrescribir todos los archivos cuando he instalado los paquetes, sin embargo la adición de Ninject.Web.WebApi y Ninject.Web.WebApi.WebHost resuelto el problema en mi combinado MVC + API Web de la aplicación.
    • No te olvides de añadir GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel); después de RegisterServices(kernel);
    • Como de 7/13/2017, utilizando WebApi2 y MVC5, esta solución no funciona para mí. Por fragmento de código en esta página thisdevmind.com/2015/01/19/…. He desinstalado WebApi y WebApi.Proveedor de alojamiento web por la recomendación, «rodar mi propia resolución» y fue capaz de conseguir que todo funcione. He seguido esta guía: peterprovost.org/blog/2012/06/19/adding-ninject-to-web-api
    • Instalar El Paquete De Ninject.Web.WebApi, no podrá instalar. recibiendo el error yo estoy usando el IDE VS2017

  2. 38

    Usted tiene este problema porque Controlador y ApiController uso diferente de la Dependencia de las Resoluciones. La solución es muy simple.

    En primer lugar de crear nuevas clases de Dependencia Resolución de la Dependencia y el Alcance. Usted puede utilizar esta:

     public class NinjectResolver : NinjectScope, IDependencyResolver
    {
    private readonly IKernel _kernel;
    public NinjectResolver(IKernel kernel)
    : base(kernel)
    {
    _kernel = kernel;
    }
    public IDependencyScope BeginScope()
    {
    return new NinjectScope(_kernel.BeginBlock());
    }
    }
    public class NinjectScope : IDependencyScope
    {
    protected IResolutionRoot resolutionRoot;
    public NinjectScope(IResolutionRoot kernel)
    {
    resolutionRoot = kernel;
    }
    public object GetService(Type serviceType)
    {
    IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
    return resolutionRoot.Resolve(request).SingleOrDefault();
    }
    public IEnumerable<object> GetServices(Type serviceType)
    {
    IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
    return resolutionRoot.Resolve(request).ToList();
    }
    public void Dispose()
    {
    IDisposable disposable = (IDisposable)resolutionRoot;
    if (disposable != null) disposable.Dispose();
    resolutionRoot = null;
    }
    }

    Después de eso, añadir la siguiente línea al método CreateKernel() en NinjectWebCommon

     GlobalConfiguration.Configuration.DependencyResolver = new NinjectResolver(kernel);
    • Esta respuesta explica que DependencyResolver a usar y cuando (relativa a la Ninject bibliotecas utilizado) stackoverflow.com/a/22255403/280564
    • Yo recomiendo utilizar el paquete de nuget que fuera ahora. Yo tenía problemas con el código de simililar a arriba
    • -1 como IActivationBlock no es la mejor manera de hacerlo y pronto será eliminado (planetgeek.ch/2012/04/23/futuro-de-la activación de los bloques). Amablemente actualización de su solución. El problema que enfrenta la implementación de la solución anterior fue de todas las dependencias de la registrada en SingletonScope se comportaban como TransientScope. Aquí hay otro enlace: stackoverflow.com/questions/26708979/…
    • por favor, actualice su respuesta con la nota Anterior y me va a quitar -1
  3. 29

    Yo tenía el mismo problema.
    Después de la instalación de los siguientes paquetes de NuGet:

    • Ninject
    • Ninject.web.WebApi
    • Ninject.web.WebApi.WebHost
    • Ninject.MVC3
    • Ninject.web.Común
    • Ninject.web.Común.WebHost

    todo funciona bien

    • +1 Gracias!. Yo no que’instalar «Ninject.web.WebApi.Servicio de hosting», y después de que usted el post lo hice yo . Todo está bien ahora.
    • Yo también necesitaba añadir Ninject.web.WebApi.WebHost gracias por la ayuda!
    • Este debe ser marcado como respuesta.
    • Ninject.web.WebApi.Servicio de hosting, crea todos los archivos que usted necesita. Sólo tienes que escribir su implementación en el RegisterServices que proporciona. Las otras respuestas son confusas. Esta es la única cosa que usted necesita hacer.
    • Esta es la respuesta que también trabajó para mí. Sin embargo, me pregunto ¿por qué tenemos todos los paquetes. ¿Alguien puede darme un link o tutorial que explica lo que está ocurriendo bajo el capó?
  4. 24

    Estoy encontró que la asamblea Ninject.Web.WebApi.dll definir propio DependencyResolver y registrarlo con el núcleo en la clase Ninject.Web.WebApi.WebApiModule automáticamente.

    Así que simplemente añadir a NinjectWebCommon.CreateKernel una línea…

    GlobalConfiguration.Configuration.DependencyResolver = 
    kernel.Get<System.Web.Http.Dependencies.IDependencyResolver>();
    

    Finalmente mi proyecto tiene las siguientes dependencias:

    • Ninject 3.2.0
    • Ninject.Web.Común 3.2.0
    • Ninject.Web.WebApi 3.2.4
    • Esto funciona para mí. Gracias
    • Goshhh funciona !!! Además , el GlobalConfiguration debe tener uso del Sistema.Web.Http; de espacio de nombres.
    • más simple y mejor respuesta
    • a mí me funciona, he añadido antes de «RegisterServices(kernel);» de la línea, dentro del try{} bloque. Gracias!
    • Gracias. Usted está impresionante. He perdido par de horas. Esto no era necesario en el proyecto de MVC, pero necesario en la API de Web.
  5. 3

    Sólo para los demás, que puede tener un conjunto similar a mí, y llegué aquí a través de google, como yo lo hice.

    Tenía múltiples aplicaciones mediante el uso WebApi proyecto. Me gustaría obtener el error de arriba, si yo no hubiera incluido el enlace en el RegisterServices método. Así que antes de tirar de su cabello, acabo de comprobar el enlace configurar. El error de no decirle a usted le faltan enlaces. Que sería si la Aplicación está en el mismo proyecto como el WebApi.

    • El error ‘asegúrese de que el controlador tiene un constructor público sin parámetros.’ es muy engañosa en este caso. Esta respuesta trabajado para mí después de horas de intentar todo tipo de otras cosas. Sólo una simple falta de unión!
  6. 2

    Hace poco he tenido que obtener la Api de Web 2 trabajar con lo que puedo responder a esa parte de la pregunta.

    Estos son los paquetes de nuget necesarios para la Api de Web 2-

    Ninject
    Ninject.Web.Common
    Ninject.Web.Common.WebHost
    Ninject.Web.WebApi 
    WebActivatorEx 
    

    A continuación, editar NinjectWebCommon.CreateKernel(..) incluyendo

    RegisterServices(kernel);
    //the next line is the important one
    GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);
    return kernel;
    

    He escrito un puesto más detallada acerca de este – http://NoDogmaBlog.bryanhogan.net/2016/04/web-api-2-and-ninject-how-to-make-them-work-together/ incluyendo una solución completa para descargar.

  7. 0

    Tuve este problema en una solución en la que el proyecto en el que yo estaba usando Ninject no estaba usando la API de Web (tengo 6 proyectos tan lejos en mi solución). Yo seguía en llegar a la temida «constructor sin parámetros necesarios», que obviamente se refería cuando he añadido el Ninject de la inyección no era conseguir crear una instancia como era de caer en el constructor vacío. He intentado varias soluciones, pero al final me registré mi Ninject paquetes y vio que el Ninject.Web.Webapi se instaló el paquete. He desinstalado este y se hizo una limpieza y reconstrucción. Ya esta resuelto el problema. Mi otro nivel inferior de proyecto se hace referencia a la Ninject.Web.Paquete de la Api y estúpidamente me había instalado en mi Web front-end del proyecto.

    Espero que esto pueda ayudar a otras personas que han tratado de toda la Pila de soluciones y no tienes donde.

Dejar respuesta

Please enter your comment!
Please enter your name here