Ninject + MVC3 = InvalidOperationException: la sequenza non contiene elementi


90

Ho creato un nuovo progetto MVC3, ho premuto F5, ho visto la pagina di esempio.

Quindi ho usato NuGet per ottenere l' estensione Ninject.MVC . Ho modificato il mio global.asax in base alla documentazione Ninject, How To Setup an MVC3 Application :

public class MvcApplication : NinjectHttpApplication
{
   public static void RegisterGlobalFilters(GlobalFilterCollection filters)
   {
       filters.Add(new HandleErrorAttribute());
   }

   public static void RegisterRoutes(RouteCollection routes)
   {
       routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

       routes.MapRoute(
           "Default", // Route name
           "{controller}/{action}/{id}", // URL with parameters
           new { controller = "Home", action = "Index", 
               id = UrlParameter.Optional });
   }

   protected override IKernel CreateKernel()
   {
       var kernel = new StandardKernel();
       kernel.Load(Assembly.GetExecutingAssembly());
       return kernel;
   }

   protected override void OnApplicationStarted()
   {
       base.OnApplicationStarted();

       AreaRegistration.RegisterAllAreas();
       RegisterGlobalFilters(GlobalFilters.Filters);
       RegisterRoutes(RouteTable.Routes);
   }
}

Ora, quando eseguo l'app, ottengo la schermata gialla della morte con la seguente eccezione:

InvalidOperationException: la sequenza non contiene elementi.

presso System.Linq.Enumerable.Single (...)

in Ninject.Web.Mvc.Bootstrapper.Initialize (...) riga 67.

E abbastanza sicuro, la riga 67 di quel file chiama .Single (), generando così l'eccezione.

Che cosa sto facendo di sbagliato?

Risposte:


101

Potresti notare che dopo aver installato ninject.mvc3NuGet c'è una App_Startsottocartella creata all'interno del tuo progetto contenente un NinjectMVC3.csfile. Elimina questa cartella e riprova. Quindi ecco i passaggi che ho seguito:

  1. Crea un nuovo progetto ASP.NET MVC 3 usando il modello predefinito
  2. Apri la finestra della Console di Gestione pacchetti (Visualizza -> Altre finestre -> Console di Gestione pacchetti)
  3. Digita install-package ninject.mvc3sulla riga di comando
  4. Sostituisci il codice predefinito Global.asaxcon il codice nella tua domanda
  5. Elimina la AppStartsottocartella creata durante l'installazione del pacchetto
  6. Esegui l'applicazione
  7. Goditi la bellezza della /Home/Indexpagina predefinita aperta nel tuo browser web Google Chrome :-)

3
Ha funzionato. Non so perché Non mi piace correggere i bug senza capirlo ... ma grazie, questo mi sblocca.
Judah Gabriel Himango

19
Non è un errore. Il pacchetto NuGet usa solo un altro modo per configurare il kernel in modo che non debba modificare global.asax. La tua applicazione ha utilizzato entrambi i modi simultaneamente, il che ha messo l'estensione in uno stato non valido poiché è stata avviata due volte.
Remo Gloor

Grazie per l'utile spiegazione, Remo.
Judah Gabriel Himango

4
Qual è il modo corretto per risolvere questo problema senza eliminare la cartella App_Start?
Ryan Lundy

12
@Kyralessa, lasciando Global.asax così com'è (non derivante da NinjectHttpApplication) e configurando il kernel nel ~/App_Start/NinjectMVC3.csfile ( RegisterServicesmetodo).
Darin Dimitrov

120

Devo aggiungere a questo nella speranza che qualcun altro risolva il problema più rapidamente e non voglia strapparsi ogni ciocca di capelli dalla testa come ho quasi fatto.

Avevo bisogno di rinominare tutto nel mio progetto in modo che corrispondesse ai nuovi termini commerciali. Ho cambiato gli spazi dei nomi ovunque e ho persino cambiato il nome dell'assembly (fai clic con il pulsante destro del mouse su progetto> proprietà> scheda applicazione) in modo che l'assieme generato corrisponda alla nuova convenzione di denominazione. La ridenominazione dell'assieme è ciò che ha fatto arrabbiare Ninject!

Rinominando l'assembly che viene generato un nuovo file con il nuovo nome è stato creato durante la compilazione. Tuttavia, il vecchio file con il vecchio nome era ancora nella directory bin! Se Ninject si attiva tramite la classe aggiunta in App_Start, questa classe di attivazione verrà richiamata in ENTRAMBI gli assembly (quello vecchio E quello nuovo rinominato). Non chiedermi come o perché, ma lo fa e ti dà questo errore "già inizializzato".

Nemmeno la soluzione di pulizia funziona perché Visual Studio rimuoverà solo i file binari che sta generando, che sarebbero quelli nuovi rinominati. Lascia i vecchi da soli seduti lì.

Vai a eliminare la cartella bin prima di provare a fare qualsiasi altra cosa! Spero che questo eviti a qualcun altro di sprecare preziose ore di lavoro!


7
Beh, ho perso circa 40 minuti prima di incappare nella tua risposta. Grazie Alex!
Maxim V. Pavlov

3
La risposta accettata non ha funzionato per me, ma questa l'ha fatto. Grazie Alex.
Pluc

2
Grazie mille! Ho bruciato un'ora su questo problema e ne avrei bruciati molti di più senza la tua risposta. Questa dovrebbe essere la risposta corretta alla domanda appropriata.
Doug

2
Brillante! Grazie Alex. Ho sprecato così tanto tempo cercando di andare in fondo a questo, la tua soluzione ha funzionato perfettamente.
Apogeo

3
È stato fantastico. Grazie mille. Ho fatto esattamente questo, una ridenominazione completa dello spazio dei nomi e non ho nemmeno attribuito i miei problemi al fatto che l'assembly era ancora costruito nel cestino. Grazie mille!
David L

23

Ho aggiornato la documentazione Wiki collegata alla tua domanda per mostrare entrambi i modi per configurare un'applicazione MVC3. Suggerisco di utilizzare la seconda opzione che è il modo preferito per il pacchetto NuGet.

Invece di derivare da NinjectHttpApplication, utilizza NinjectMVC.cs nella cartella AppStart che viene creata durante l'installazione del pacchetto. Questa è anche la posizione in cui crei il kernel e dove carichi i tuoi moduli o dove definisci i collegamenti.


Molto utile, Remo. Dato che ho già segnato una risposta, mi limiterò a votare a favore della tua e forse a votare a favore di qualche altra tua. Grazie per aver fatto di tutto per rispondere e aggiornare il Wiki.
Judah Gabriel Himango

4

Come ha detto Alex Ford:

A questo devo aggiungere la speranza che qualcun altro risolva il problema più rapidamente e non voglia strapparsi ogni ciocca di capelli dalla testa come ho quasi fatto io.

Avevo una versione speciale di quel problema che poteva essere risolta come segue:

Dettagli eccezione: System.InvalidOperationException: la sequenza non contiene elementi

Questo errore è causato dal fatto che sono presenti 2 progetti con App_Start / NinjectWebCommon.cs

La rimozione del file elimina l'errore.

Nota: se stai ottenendo Ninject.Web.Common perché devi fare riferimento all'assembly Ninject.Web.Common per uno dei tuoi progetti di libreria di classi, puoi rimuovere in sicurezza la cartella "App_Start" e "NinjectWebCommon.cs". È pensato per progetti web / web api.

> fai clic qui per visualizzare il post originale del blog <


Dopo aver cambiato lo spazio dei nomi dei miei progetti, oggi mi sono imbattuto di nuovo nello stesso problema. Tutte le soluzioni qui non hanno aiutato. La pulizia e la ricostruzione non hanno aiutato. Ma ciò che ha aiutato è stato l'eliminazione delle cartelle bin e obj del mio progetto. Sembra che ci siano ancora alcuni pezzi della vecchia parte dello spazio dei nomi che non sono stati eliminati con una pulizia.
Wowe

Ciao Da_Wolf, questo è tutto. Grazie. Hai risolto il mio problema
VivekDev

2

La mia soluzione era che avevo impostato la proprietà della cartella App_Start, Namespace Provider su True.

L'ho cambiato in False in modo che Resharper non evidenziasse lo spazio dei nomi NON corrispondente alla struttura della cartella.


Questo è stato per me, facendomi impazzire.
rashleighp

2

Volevo aggiungere un'altra causa ...

Abbiamo installato il pacchetto Ninject.MVC3 su più progetti, solo uno dei quali era un'effettiva applicazione MVC. Tuttavia, ci siamo dimenticati di rimuovere la cartella App_Start.

La rimozione della cartella App_Start dal progetto di riferimento ha risolto il problema.


Si! Era questo! Avevo aggiunto per errore un secondo file Ninjectwebcommon.cs su un altro progetto! Questo è stato (utilizzando MVC 5)
Jose A

1

Per continuare con la risposta di @ Chev ... questo è stato anche il mio problema finale. Se stai distribuendo su un sito Web di Azure (ora denominato AppSite), fai clic su questa casella nella pubblicazione per rimuovere i vecchi file

pubblicare su screenshot azzurro


Questa è esattamente la stessa foto che stavo per postare! Vorrei aver fatto scorrere fino a questa risposta, ma le risposte precedenti mi portano a questa idea. +1
Jess
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.