webentwicklung-frage-antwort-db.com.de

ASP.NET MVC 4 + Ninject MVC 3 = Kein parameterloser Konstruktor für dieses Objekt definiert

UPDATE - Bitte sehen Sie sich meine Antwort an, um einen Link und eine Erklärung zur Lösung dieses Problems zu erhalten.

Bevor wir anfangen, weiß ich, dass dies eine sehr häufige Frage ist, und ich habe Ninject für viele Monde ohne Probleme verwendet, aber jetzt ist es soweit und ich kann keine Lösung finden. Nein, die Ergebnisse bei Google und SO haben mir bisher nicht geholfen.

Betrachten Sie also den folgenden Code, der auf einem sehr, sehr, sehr einfachen Prototyp eines ASP.NET MVC 4-Projekts aus Visual Studio 2012 unter Windows Server 2008 R2 ausgeführt wird:

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

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

Und hier ist die NinjectWebCommon.cs RegisterServices-Methode:

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

Nun, so funktionieren meine anderen Projekte, die Ninject verwenden (aber ASP.NET MVC 3 unter .NET 4), und soweit ich weiß, ist es das, was nötig ist, damit alles funktioniert. Warum bekomme ich plötzlich Kein parameterloser Konstruktor für dieses Objekt definiert? Ausnahmen?

UPDATE

Hier ist die vollständige NinjectWebCommon.cs-Datei:

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

UPDATE - Bitte sehen Sie sich meine Antwort an, um einen Link und eine Erklärung zur Lösung dieses Problems zu erhalten.

37
Gup3rSuR4c

Nun, ich habe keine genaue Antwort warum der Fehler wird angezeigt, aber ich weiß, dass wer dies verursacht, und das ist Visual Studio 2012. Ich habe Visual Studio 2010 installiert Dieselbe Maschine wie 2012, installierte ASP.NET MVC 4 für 2010, und ich erstellte das 2012-Projekt in Word 2010 für Word, Buchstaben für Buchstaben. Das Endergebnis ist, dass, wenn 2010 das Programm debugiert, alles gut funktioniert und Ninject die Abhängigkeiten wie gewünscht einfügt.

Wenn 2012 sein Projekt debuggt, wird nur die No parameterless constructor defined for this object-Ausnahme angezeigt. Das Neu-Targeting zwischen .NET 4.0 und .NET 4.5 im Jahr 2012 bringt nichts. Durch die Neuinstallation von Ninject aus NuGet wird auch nichts getan. Ich habe sogar 2010- und 2012-Projekte so konfiguriert, dass der lokale IIS -Server absolut sicher ist und das Endergebnis das gleiche ist.

Ich gehe davon aus, dass es einen Fehler mit Visual Studio 2012 oder Ninject gibt. Der einzige Unterschied zwischen den beiden Projekten besteht darin, von welchen IDE sie laufen, und das 2012-Projekt stürzt ab. Deshalb zeige ich mit dem Finger auf Visual Studio 2012.

UPDATE

Jungs. JUNGS! Ich bin wieder auf dieses Problem gestoßen und habe die Lösung in einer anderen SO Frage gefunden: Ninject + MVC3 injiziert nicht in Controller .

Grundsätzlich fehlt Folgendes in der Web.config, wodurch es funktioniert:

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

Ich denke, dies zwingt den Rahmen, sich der IoC-Container bewusst zu werden, die es Ninject ermöglichen, endlich zu binden. Ich kann jedoch nicht anders als zu denken, dass das Ninject NuGet-Paket nach der verbindlichen Weiterleitung in der Web.config suchen und es automatisch hinzufügen muss. Es würde sicherlich helfen, dass bei diesem Problem viele Haare gezogen werden.

P.S. Stimmen Sie den Rotz aus dem Post ab, den ich verlinkt habe, weil er es verdient hat!

28
Gup3rSuR4c

Ich weiß, dass dies eine alte Frage ist, aber es scheint keine wirklichen Antworten zu geben, und ich habe das Problem gelöst, also hier meine Lösung:

Erstellen Sie eine benutzerdefinierte Controller-Fabrik:

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

Wenn Sie NinjectHttpApplication verwenden, fügen Sie OnApplicationStarted dann die folgende Zeile hinzu:

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

Wenn Sie NinjectHttpApplication nicht verwenden, fügen Sie diese Zeile nach dem Erstellen des Kernels an einer beliebigen Stelle hinzu, und übergeben Sie dem neu erstellten Kernel eine Referenz.

Das ist es.

48
Jere.Jones

Das Rad nicht neu erfinden und einfach Install-Package Ninject.MVC3 ausprobieren

7
Juanjo

Ich habe dieselbe Fehlermeldung erhalten, nachdem ich die MVC3 von NuGet erhalten habe.
Ich weiß nicht, ob Sie Ihr Projekt auf dieselbe Weise eingerichtet haben wie ich, aber mein web.config wird abhängig von der Umgebung automatisch generiert. Die MVC von NuGet fügt rows (<runtime>) zum web.config hinzu und diese Zeilen wurden entfernt, da meine zusammengeführten Konfigurationsdateien nicht korrekt eingerichtet wurden.

Grüße,

Kim

3
Kim Thörning

Das Ganze ist einfach lächerlich, ich habe zu Autofac gewechselt und bin es leid, Ninject nie zu einem erfolgreichen Projekt hinzufügen zu können. Web-API, MVC4, MVC5 hatten alle Probleme.

Für MVC5-Benutzer, die Ninject MVC3 verwenden, fügen Sie der App-Ebene "Web.config" Folgendes hinzu:

 <runtime>
        <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35"/>
                <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
            </dependentAssembly>
            <dependentAssembly>
                <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35"/>
                <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
            </dependentAssembly>
            <dependentAssembly>
                <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
                <bindingRedirect oldVersion="1.0.0.0-5.1.0.0" newVersion="5.1.0.0"/>
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
2
Brian Ogden

Hier ist eine schmutzige Lösung! Setzen Sie dies 

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

am Anfang des AppStart-Ereignisses (oder irgendwo anders)

Lassen Sie mich nun erklären, was es bedeutet, wenn jemand noch keinen Trick bekommen hat.__Das ist unsere http-Anwendungsklasse, die sich irgendwo in der Lösung befinden kann. Nicht nur in der Webanwendung. Und das ist sehr wichtig .__, weil sich die asp.net-Kompilierungsroutine von den üblichen Bibliotheksanwendungen unterscheidet. Es lädt ALLE referenzierten Bibliotheken mit Hilfe des BuildManager-Hilfsprogramms ein. Normalerweise lädt clr Typen nicht vom Start aus, es sei denn, sie werden direkt verwendet.

Nun zurück zu unserer Situation: Ninject.Web.Mvc funktioniert als dynamisches Plugin, das keine Erwähnung innerhalb eines Codes erfordert. Und wird daher nicht geladen, wenn in der Klassenbibliothek darauf verwiesen wurde, was zu einer fehlerhaften Initialisierung von Mvc.Dependancy führt. 

1
wallice

Das Problem scheint aufzutreten, wenn Visual Studio 2012/2013 mit ASP.NET 4.0/4.5 verwendet wird. Die Version von System.Web.Mvc wurde in der 4.0.0.0-Datei auf Web.config gesetzt. Es hat nicht funktioniert. 

Meine Lösung war zu 

  1. NinjectWebCommon.cs löschen 
  2. kopieren Sie die NinjectControllerFactory-Klasse von Dere Jone in das Projekt: 

    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. Ändern Sie den Inhalt von Global.asax in: 

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

    danach sollten Ihre Injektionen funktionieren. 

1
MovGP0

Ich habe das gleiche Problem und die einzige Sache, die für mich funktioniert, ist, den "lokalen IIS Webserver" in den Webprojekt-Eigenschaften in "Visual Studio Development Server verwenden" zu ändern.

enter image description here

Ich weiß nicht warum, aber wenn ich das tue, wird mein Haltepunkt in NinjectWebCommon hited. Wie @Alex sagte, ist es mit Visual Studio 2012 nicht genug hell, um den Code in NinjectWebCommon jedes Mal auszuführen, wenn Sie Ihre Anwendung erstellen. Es ist auch möglich, dass ich nicht hell genug bin, um zu verstehen, wie es unter der Haube funktioniert.

Ich mag meine Lösung nicht, weil ich es vorziehen würde, meinen lokalen IIS - Webserver zu verwenden, aber im Moment muss ich eine Anwendung erstellen und habe mit diesem $%? !!/bug..feature viel Zeit gebraucht ..nicht sicher.

0
Samuel

Ich habe meine repariert, indem ich Ninject MVC5 entfernte und Ninject MVC3 von Nuget installiere.

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

Überprüfen Sie die Version von System.Web.MVC in den Referenzen, um sich zu vergewissern, in welcher Version von MVC Sie sich aktuell befinden.

0
MiloTheGreat

Ich habe alle diese Lösungen ausprobiert, aber keine hat funktioniert. 

So habe ich es gelöst: Alle meine temporären asp.net-Dateien wurden gelöscht. Nachdem ich das getan hatte, bekam ich neue Konfigurationsfehler. Ich habe sie repariert. Der letzte und echte Fehler kam heraus: Neuer Bootstrapper () versuchte, eine ältere Version einer ninject-dll zu laden Alle ninject-Pakete wurden entfernt Version ist installiert.

0
dawidg

Abkürzung für all dies: Laden Sie eines der folgenden Nuget Pacakges herunter:

  • Ninject.MVC3
  • Ninject.MVC5

Das kümmert sich um die Bindung, die Sie brauchen.

0
jhilden

Dies wurde für mich durch Hinzufügen eines Verweises über Nuget zu Ninject.Web.MVC gelöst.

0
hanzolo

Ich habe mir bei einem kürzlich durchgeführten Projekt, das ich von MVC 3 auf MVC 4 verlegt habe, einige Stunden lang die Haare ausgezogen. Mit dem Fehlen von Punktantworten dachte ich, dass es etwas sein musste, das ich getan habe, wie es scheint, das Ninject.MVC3-Nuget Das Paket funktioniert gut mit MVC 4 - und das tut es auch.

In meinem Fall habe ich das MVC3-Projekt nicht vollständig aktualisiert. Nach dem Befolgen von diesem Leitfaden habe ich die Dinge wie erwartet funktioniert. Meine Vermutung war, dass mir eine verbindliche Weiterleitung der Assembly fehlte.

Wenn Sie also ein MVC 3-Projekt auf MVC 4 aktualisieren, Ninject verwenden und den definierten Parameter ohne Konstruktor ohne Parameter erhalten, hoffen Sie, dass dies hilft.

0
JasonCoder

Wie alle vorherigen Plakate festgestellt haben, hat dies einige graue Haare verursacht. In meinem Fall hatte ich meine Referenzen zu sehr "optimiert". Ninject. * Zeug war da, war aber verstümmelt. Ich habe alle Referenzen gelöscht und die Packages.conf manualli bereinigt und die Pakete wieder hinzugefügt - Sieg!

0
juhan_h

Ich konnte dieses Problem in einem MVC5-Webprojekt beheben, indem ich eine # if #endif-Direktive aus meinem Controller-Konstruktor entfernte.

0
James Blake

Ich habe dieses Problem jedoch nur bei Webdienstaufrufen erhalten. Ich habe meine Lösung zu dieser Antwort gefunden https://stackoverflow.com/a/12379938/129580 unten ist der bereitgestellte Beispielcode 

public class Service : WebService
{
  public IContextProvider ContextProvider {get;set;}

  public Service()
  {
    ContextProvider = DependencyResolver.Current.GetService<IContextProvider>();
  }
}

was ich dann fertig gemacht habe, hoffe das hilft ...

/// <summary>
/// Summary description for PartMarking
/// </summary>
[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<IUnitOfWork>();
    }

    [WebMethod]
    public DataSet GetParentConfigurations(string engineModel, string componentCode)
    {
        var results = _unitOfWork.PartMarking.GetParentSicMarkings(engineModel, componentCode);
        return results;
    }
}
0

Ich habe versucht, Ninject mit MVC 5 einzurichten. Schließlich musste ich die Lösung zuerst mit der Controller-Factory und dann mit der Bindungsumleitung verwenden. Danach funktioniert alles wie erwartet. Verwendeter lokaler IIS Server.

0
n0ne