39 votes

ASP.NET MVC 4 + Ninject MVC 3 = Aucun constructeur sans paramètre défini pour cet objet

Mise à JOUR - Merci de regarder ma réponse pour un lien et l'explication de la solution à ce problème

Avant de commencer, je sais que c'est une question très fréquente et j'ai été en utilisant Ninject pour de nombreuses lunes sans problèmes, mais maintenant il est venu et je ne peux pas comprendre un correctif. Aussi, aucun, aucun des résultats sur Google et AINSI de si loin m'ont aidé.

Donc, considérez le code suivant exécute sur un très, très, très simple prototype ASP.NET MVC 4 projet de Visual Studio 2012 sur Windows Server 2008 R2:

public class DefaultController : Controller {
    private IGroupPrincipalRepository GroupPrincipalRepository { get; set; }

    [Inject]
    public DefaultController(
        IGroupPrincipalRepository groupPrincipalRepository) {
        this.GroupPrincipalRepository = groupPrincipalRepository;
    }
}

Et voici l' NinjectWebCommon.cs RegisterServices méthode:

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

Maintenant, c'est comment mes autres projets qui utilisent Ninject (mais sont ASP.NET MVC 3 sur .NET 4) les travaux et pour autant que je sais que c'est ce qui est nécessaire pour faire fonctionner le tout. Alors, pourquoi suis-je tout d'un coup se Pas de constructeur sans paramètre défini pour cet objet. des exceptions?

Mise à JOUR

Voici l'intégralité NinjectWebCommon.cs le fichier:

[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<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
            kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

            RegisterServices(kernel);
            return kernel;
        }

        private static void RegisterServices(
            IKernel kernel) {
            kernel.Bind(typeof(IGroupPrincipalRepository)).ToConstructor(
                c =>
                    new GroupPrincipalRepository(new PrincipalContext(ContextType.Domain, "", "", "", ""))).InSingletonScope();
        }
    }
}

Mise à JOUR - Merci de regarder ma réponse pour un lien et l'explication de la solution à ce problème

48voto

Jere.Jones Points 5394

Je sais que c'est une vieille question, mais il ne semble pas y avoir de vraies réponses et j'ai contourné le problème, donc, voici ma solution:

Créer un contrôleur de l'usine:

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);
    }
}

Ensuite, si vous utilisez NinjectHttpApplication, ajoutez la ligne suivante à OnApplicationStarted:

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

Si vous n'utilisez pas NinjectHttpApplication, puis ajouter cette ligne quelque part après avoir créé votre noyau et de passer une référence à votre fraîchement créé noyau.

C'est tout.

28voto

Alex Points 2894

Eh bien, je n'ai pas de réponse exacte pourquoi l'erreur est à venir, mais je ne sais qui en est la cause et qui est Visual Studio 2012. J'ai installé Visual Studio 2010 sur la même machine que 2012, installé ASP.NET MVC 4 pour 2010 et j'ai recréé le projet 2012 en 2010, mot pour mot, lettre pour lettre. Le résultat final est que lorsque 2010 débogue le projet tout fonctionne bien et Ninject injecte les dépendances comme il se doit.

Lorsque 2012 débogue son projet il vient juste avec l' No parameterless constructor defined for this object d'exception. Re-ciblage des entre .NET 4.0 et .NET 4.5 en 2012 ne rien faire. Re-installation de Ninject de NuGet aussi ne pas faire n'importe quoi. J'ai même configuré en 2010 et en 2012 des projets pour utiliser le serveur IIS pour être absolument sûr et le résultat final est le même.

Je vais supposer qu'il y a un bug avec Visual Studio 2012 ou avec Ninject. La seule différence que j'ai eu entre les deux projets est que l'IDE qu'ils exécutent de et la projet 2012 est celui qui plante c'est pour ça que je suis pointant du doigt Visual Studio 2012.

Mise à JOUR

Les gars. Les GARS! J'ai rencontré ce problème et trouvé la solution dans un autre DONC, la question: Ninject + MVC3 n'est pas d'injecter dans le contrôleur.

Fondamentalement, ce est ce qui manque sur le Web.config qui fait que cela fonctionne:

<dependentAssembly>
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>

Je devine que cela oblige le cadre pour être au courant de la Coi conteneurs qui permet Ninject enfin être capable de se lier. Bien, je peux pas m'empêcher de penser que le Ninject NuGet package doit rechercher l'existence de cette liaison de redirection dans le Web.config et l'auto-magiquement l'ajouter. Il vous aidera avec beaucoup de cheveux, tirant qui se passe autour de cette question.

P. S. Jusqu'-vote de la morve de ce post, j'ai lié parce qu'il le mérite!

3voto

Kim Thörning Points 21

J'ai reçu le même message d'erreur après avoir récupéré le MVC3 de NuGet.
Je ne sais pas si vous avez configuré votre projet de la même manière que moi, mais mon web.config est généré automatiquement en fonction de l'environnement. Le MVC de NuGet ajoute rows (<runtime>) au web.config et ces lignes ont été supprimées car la fusion de mes fichiers de configuration n’avait pas été correctement configurée.

Cordialement,

Kim

1voto

wallice Points 71

Voici une solution sale! Mettre cette

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

dans le début de la AppStart événement (ou ailleurs )

Maintenant, laissez-moi vous expliquer ce que cela signifie que si quelqu'un n'ai pas de se tromper encore. Chose est notre http classe d'application pourrait résider n'importe où dans la solution. Non seulement dans l'application web. Et c'est très important parce que asp.net compilation routine est différent de d'habitude les applications de bibliothèque. Il avec impatience charge TOUTES les bibliothèques référencées par BuildManager aide, alors que d'ordinaire le clr ne prend pas en charge les types de démarrer, sauf s'ils sont directement utilisés.

Maintenant, revenons à notre situation: Ninject.Web.Mvc travail dynamique d'un plugin, qui ne nécessite pas de mentionner dans un code. Et n'est donc pas chargé si il a été fait référence à l'intérieur de la bibliothèque de la Classe qui conduit à des ruptures de Mvc.Dépendance de l'initialisation.

1voto

MovGP0 Points 77

Le Problème semble se produire lorsque l'on utilise Visual Studio 2012/2013 avec ASP.NET 4.0/4.5. La version d' System.Web.Mvc a été fixé pour 4.0.0.0 dans la Web.config le fichier. Il n'a pas de travail.

Ma solution a été de

  1. supprimer NinjectWebCommon.cs
  2. copie Dere Jone s NinjectControllerFactory de la classe dans le projet:

    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. modifier le contenu de Global.asax à la:

    public class MvcApplication : NinjectHttpApplication
    {
       protected override IKernel CreateKernel()
       {
           IKernel kernel = new StandardKernel();
    
           // kernel.Load(Assembly.GetExecutingAssembly());
    
           // kernel.Bind<ISomeClass>().To<SomeClass>();
    
           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));
       }
    }
    

    après que votre injections doivent travailler.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X