ASP.NET MVC 4 + Ninject MVC 3 = Nessun costruttore senza parametri definito per questo object

AGGIORNAMENTO – Si prega di guardare la mia risposta per un collegamento e la spiegazione della soluzione a questo problema

Prima di iniziare, so che questa è una domanda molto comune e sto usando Ninject per molte lune senza problemi, ma ora è venuto fuori e non riesco a capire una soluzione. Inoltre, no, nessuno dei risultati su Google e SO finora mi ha aiutato.

Quindi, considera il seguente bit di codice in esecuzione su un prototipo molto, molto, molto semplice di ASP.NET MVC 4 da Visual Studio 2012 su Windows Server 2008 R2:

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

Ed ecco il metodo NinjectWebCommon.cs RegisterServices :

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

Ora, questo è il modo in cui funzionano i miei altri progetti che usano Ninject (ma sono ASP.NET MVC 3 su .NET 4) e per quanto ne so è ciò che è necessario per far funzionare tutto. Quindi, perché ottengo improvvisamente Nessun costruttore parametrico definito per questo object. eccezioni?

AGGIORNARE

Ecco il file completo di 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(); } } } 

AGGIORNAMENTO – Si prega di guardare la mia risposta per un collegamento e la spiegazione della soluzione a questo problema

So che questa è una vecchia domanda ma non sembrano esserci risposte reali e ho lavorato attorno al problema, ecco la mia soluzione:

Creare una fabbrica di controller personalizzata:

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

Quindi, se si utilizza NinjectHttpApplication, aggiungere la seguente riga a OnApplicationStarted:

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

Se non si utilizza NinjectHttpApplication, aggiungere la riga da qualche parte dopo aver creato il kernel e passargli un riferimento al proprio kernel appena creato.

Questo è tutto.

Beh, non ho una risposta esatta perché l’errore sta arrivando, ma so chi lo sta causando e questo è Visual Studio 2012. Ho installato Visual Studio 2010 sullo stesso computer del 2012, installato ASP.NET MVC 4 per il 2010 e ho ricreato il progetto 2012 nel 2010 parola per parola, lettera per lettera. Il risultato finale è che quando il 2010 esegue il debug del progetto, tutto funziona correttamente e Ninject inietta le dipendenze come dovrebbe.

Quando nel 2012 si esegue il debug del progetto, viene visualizzato solo il No parameterless constructor defined for this object eccezione No parameterless constructor defined for this object . Re-targeting tra .NET 4.0 e .NET 4.5 nel 2012 non fa nulla. Anche la reinstallazione di Ninject da NuGet non fa nulla. Ho persino configurato entrambi i progetti 2010 e 2012 per utilizzare il server IIS locale per essere assolutamente sicuro e il risultato finale è lo stesso.

Presumo che ci sia un bug con Visual Studio 2012 o con Ninject. L’unica differenza che ho tra i due progetti è l’IDE da cui sono in esecuzione e il progetto 2012 è quello che va in crash, ecco perché sto puntando il dito su Visual Studio 2012.

AGGIORNARE

Ragazzi. Ragazzi! Mi sono imbattuto di nuovo in questo problema e ho trovato la soluzione in un’altra domanda SO: Ninject + MVC3 non si sta iniettando nel controller .

Fondamentalmente, questo è ciò che manca a Web.config che lo fa funzionare:

     

Immagino che questo costringa il framework a prendere coscienza dei contenitori IoC che consente a Ninject di essere finalmente in grado di legarsi. Sebbene, non posso fare a meno di pensare che il pacchetto NinGG NuGet dovrebbe cercare l’esistenza di quel reindirizzamento vincolante in Web.config e aggiungerlo automaticamente magicamente. Sarebbe sicuramente di aiuto con un sacco di capelli che si verificano su questo problema.

PS Up-vota il moccio di quel post che ho linkato perché lo merita!

Non reinventare la ruota e basta provare Install-Package Ninject.MVC3

Ho ricevuto lo stesso messaggio di errore dopo aver ricevuto MVC3 da NuGet.
Non so se hai configurato il tuo progetto nello stesso modo in cui lo faccio io, ma il mio web.config è generato automaticamente a seconda dell’ambiente. L’MVC di NuGet sta aggiungendo le rows () al web.config e quelle file sono state rimosse dal momento che i miei file di config-fusione non sono stati impostati correttamente.

Saluti,

Kim

Ecco una soluzione sporca! Metti questo

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

all’inizio dell’evento AppStart (o da qualsiasi altra parte)

Ora lascia che ti spieghi cosa vuol dire se qualcuno non ha ancora ottenuto un trucco. La nostra class di applicazioni http potrebbe risiedere ovunque in una soluzione. Non solo nell’applicazione web. E questo è molto importante perché la routine di compilazione di asp.net è diversa dalle solite applicazioni di libreria. Carica avidamente TUTTE le librerie di riferimento tramite l’helper BuildManager, mentre di solito clr non carica i tipi dall’inizio, a meno che non vengano utilizzati direttamente.

Ora torniamo alla nostra situazione: Ninject.Web.Mvc funziona come plug-in dinamico, che non richiede alcuna menzione all’interno di un codice. E quindi non viene caricato se è stato fatto riferimento all’interno della libreria di classi che porta all’inizializzazione di Mvc.Dependancy interrotta.

Il problema sembra verificarsi quando si utilizza Visual Studio 2012/2013 con ASP.NET 4.0 / 4.5. La versione di System.Web.Mvc era impostata su 4.0.0.0 nel file Web.config . Non ha funzionato.

La mia soluzione era

  1. elimina NinjectWebCommon.cs
  2. copia la class NinjectControllerFactory Dere Jone nel progetto:

     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. cambia il contenuto di Global.asax in:

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

    dopo che le iniezioni dovrebbero funzionare.

L’intera faccenda è semplicemente ridicola, sono passato ad Autofac, stanco di non poter mai aggiungere con successo Ninject a un progetto. Web API, MVC4, MVC5 hanno tutti avuto problemi.

Per le persone MVC5, utilizzando Ninject MVC3, aggiungere quanto segue al livello dell’app web.config:

                  

Mi stavo strappando i capelli per diverse ore su un recente progetto che ho spostato da MVC 3 a MVC 4. Con la mancanza di risposte puntuali ho pensato che doveva essere qualcosa che ho fatto come sembra che il Ninject.MVC3 nuget il pacchetto funzionerà perfettamente con MVC 4 e in effetti lo fa.

Nel mio caso non stavo aggiornando completamente il progetto MVC3. Dopo aver seguito questa guida ho ottenuto le cose per funzionare come previsto. La mia ipotesi era che mi mancava un reindirizzamento dell’associazione.

Pertanto, se si sta aggiornando un progetto MVC 3 su MVC 4, utilizzando Ninject e ottenendo l’errore definito da nessun costruttore senza parametri, si spera che ciò sia utile.

Come tutti i precedenti poster hanno dichiarato questo mi ha causato dei capelli grigi. Nel mio caso ho “ottimizzato” troppo le mie referenze. Le cose di Ninject. * Erano lì ma erano state mutilate. Ho cancellato tutti i riferimenti e pulito packages.conf manualli e ho aggiunto di nuovo i pacchetti – vittoria!

Ho lo stesso problema e l’unica cosa che funziona per me è modificare il “server Web IIS locale” nelle proprietà del progetto Web su “Usa Visual Studio Development Server”.

inserisci la descrizione dell'immagine qui

Non so perché, ma quando lo faccio, il punto di interruzione in NinjectWebCommon è hited. Come ha detto @Alex, è qualcosa con Visual Studio 2012 non abbastanza brillante da eseguire il codice in NinjectWebCommon ogni volta che si crea l’applicazione. È anche ansible che non sono abbastanza brillante per capire come funziona sotto il cofano.

Non mi piace la mia soluzione perché preferirei usare il mio server Web IIS locale, ma per il momento ho un’applicazione per creare e molto tempo con questa caratteristica $%? !! / bug..non sono sicuro .

Questo è stato risolto per me aggiungendo un riferimento via Nuget a Ninject.Web.MVC.

Ho provato tutte queste soluzioni, ma nessuna ha funzionato.

Questo è il modo in cui l’ho risolto: cancellato tutti i miei file temp asp.net. Dopo averlo fatto, ho ricevuto nuovi errori di configurazione. Li ho riparati. L’ultimo errore reale è venuto fuori: il nuovo Bootstrapper () stava tentando di caricare una versione precedente di una DLL ninject. Rimosso tutti i pacchetti ninject. Installate i pacchetti ninject nuget uno per uno, assicuratevi triplicamente che sia installata la versione corretta.

Ho provato a configurare Ninject con MVC 5. Alla fine ho dovuto utilizzare prima la soluzione con controller factory e quindi la soluzione con reindirizzamento binding. Dopo tutto funziona come previsto. Server IIS locale utilizzato.

Sono stato in grado di risolvere questo problema in un progetto Web MVC5 rimuovendo una direttiva #if #endif dal mio costruttore di controller.

Scorciatoia per tutto questo: Scarica uno dei seguenti Nuget Pacakges:

  • Ninject.MVC3
  • Ninject.MVC5

Questo si prenderà cura del legame che ti serve.

Ho risolto il problema con la rimozione di Ninject MVC5 e l’installazione di Ninject MVC3, da Nuget.

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

Controllare la versione di System.Web.MVC nei riferimenti per verificare quale versione di MVC si è attualmente triggers.

Stavo ricevendo questo problema, ma solo sulle chiamate al servizio web. Ho trovato la mia soluzione su questa risposta https://stackoverflow.com/a/12379938/129580 di seguito è riportato il codice di esempio

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

che poi ho finito per trasformarmi, spero che questo aiuti …

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