Ninject + MVC3 = InvalidOperationException: Die Sequenz enthält keine Elemente

90

Ich habe ein neues MVC3-Projekt erstellt, F5 gedrückt und die Beispielseite gesehen.

Dann habe ich NuGet verwendet, um die Ninject.MVC-Erweiterung zu erhalten . Ich habe meine global.asax gemäß der Ninject-Dokumentation, So richten Sie eine MVC3-Anwendung ein :

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

Wenn ich jetzt die App starte, wird der gelbe Bildschirm des Todes mit der folgenden Ausnahme angezeigt:

InvalidOperationException - Die Sequenz enthält keine Elemente.

bei System.Linq.Enumerable.Single (...)

bei Ninject.Web.Mvc.Bootstrapper.Initialize (...) Zeile 67.

Und tatsächlich ruft Zeile 67 dieser Datei .Single () auf und löst so die Ausnahme aus.

Was mache ich falsch?

Judah Gabriel Himango
quelle

Antworten:

101

Möglicherweise stellen Sie fest, dass nach der Installation von ninject.mvc3NuGet App_Startin Ihrem Projekt ein Unterordner erstellt wurde, der eine NinjectMVC3.csDatei enthält. Löschen Sie diesen Ordner und versuchen Sie es erneut. Hier sind die Schritte, denen ich gefolgt bin:

  1. Erstellen Sie ein neues ASP.NET MVC 3-Projekt mit der Standardvorlage
  2. Rufen Sie das Fenster Package Manager Console auf (Ansicht -> Andere Fenster -> Package Manager Console).
  3. Geben Sie install-package ninject.mvc3in die Befehlszeile ein
  4. Ersetzen Sie den Standardcode Global.asaxdurch den Code in Ihrer Frage
  5. Löschen Sie den AppStartUnterordner, der während der Installation des Pakets erstellt wurde
  6. Führen Sie die Anwendung aus
  7. Genießen Sie die Schönheit der /Home/IndexStandardseite, die in Ihrem Google Chrome-Webbrowser geöffnet wurde :-)
Darin Dimitrov
quelle
3
Das hat funktioniert. Ich weiß nicht warum. Ich mag es nicht, Fehler zu beheben, ohne es zu verstehen ... aber danke, das macht mich frei.
Judah Gabriel Himango
19
Es ist kein Fehler. Das NuGet-Paket verwendet nur eine andere Methode zum Einrichten des Kernels, sodass die Datei global.asax nicht geändert werden muss. Ihre Anwendung hat beide Methoden gleichzeitig verwendet, wodurch die Erweiterung beim zweimaligen Starten in einen ungültigen Zustand versetzt wurde.
Remo Gloor
Vielen Dank für die hilfreiche Erklärung, Remo.
Judah Gabriel Himango
4
Was ist der richtige Weg, um dies zu lösen, ohne den Ordner App_Start zu löschen?
Ryan Lundy
12
@Kyralessa, indem Sie Global.asax unverändert lassen (nicht abgeleitet von NinjectHttpApplication) und den Kernel in der ~/App_Start/NinjectMVC3.csDatei ( RegisterServicesMethode) konfigurieren .
Darin Dimitrov
120

Ich muss noch hinzufügen, in der Hoffnung, dass jemand anderes das Problem schneller löst und nicht jede Haarsträhne auf dem Kopf herausziehen möchte, wie ich es fast getan hätte.

Ich musste alles in meinem Projekt umbenennen, um neuen Geschäftsbedingungen zu entsprechen. Ich habe überall Namespaces geändert und sogar den Assembly-Namen (Rechtsklick auf Projekt> Eigenschaften> Registerkarte Anwendung) geändert, damit die generierte Assembly der neuen Namenskonvention entspricht. Die Umbenennung der Versammlung machte Ninject sehr wütend!

Durch Umbenennen der Assembly, die generiert wird, wurde beim Kompilieren eine neue Datei mit dem neuen Namen erstellt. Die alte Datei mit dem alten Namen befand sich jedoch noch im bin-Verzeichnis! Wenn Ninject über die hinzugefügte Klasse in App_Start aktiviert wird, wird diese Aktivierungsklasse in BEIDEN Assemblys (alte UND neue umbenannte) aufgerufen. Fragen Sie mich nicht wie oder warum, aber es tut es und es gibt Ihnen diesen "bereits initialisierten" Fehler.

Nicht einmal die Reinigungslösung funktioniert, da Visual Studio nur die von ihm generierten Binärdateien entfernt, dh die neu umbenannten. Es lässt die Alten allein und sitzt einfach da.

Löschen Sie Ihren Bin-Ordner, bevor Sie etwas anderes versuchen! Ich hoffe, das erspart jemand anderem wertvolle Arbeitsstunden!

Chev
quelle
7
Nun, ich habe ungefähr 40 Minuten verschwendet, bevor ich auf Ihre Antwort gestoßen bin. Danke Alex!
Maxim V. Pavlov
3
Akzeptierte Antwort hat es nicht für mich getan, aber diese hat es getan. Danke Alex.
Pluc
2
Ich danke dir sehr! Ich habe eine Stunde in dieser Angelegenheit gebrannt und hätte ohne Ihre Antwort noch viel mehr gebrannt. Dies sollte die richtige Antwort auf die entsprechende Frage sein.
Doug
2
Brillant! Danke Alex. Ich habe so viel Zeit damit verschwendet, dem auf den Grund zu gehen, dass Ihre Lösung perfekt funktioniert hat.
Apogee
3
Das war fantastisch. Ich danke dir sehr. Ich habe genau das getan, eine vollständige Umbenennung des Namespace, und meine Probleme nicht einmal der Tatsache zugeschrieben, dass die Assembly noch im Bin erstellt wurde. Vielen Dank!
David L
23

Ich habe das in Ihrer Frage verlinkte Dokumentations-Wiki aktualisiert, um beide Möglichkeiten zum Einrichten einer MVC3-Anwendung aufzuzeigen. Ich schlage vor, die zweite Option zu verwenden, die der bevorzugte Weg für das NuGet-Paket ist.

Anstatt von NinjectHttpApplication abzuleiten, wird NinjectMVC.cs im AppStart-Ordner verwendet, der während der Installation des Pakets erstellt wird. Dies ist auch der Ort, an dem Sie den Kernel erstellen und Ihre Module laden oder an dem Sie die Bindungen definieren.

Remo Gloor
quelle
Sehr hilfreich, Remo. Da ich bereits eine Antwort markiert habe, werde ich nur Ihre und vielleicht auch einige andere von Ihnen positiv bewerten. Vielen Dank, dass Sie das Wiki beantwortet und aktualisiert haben.
Judah Gabriel Himango
4

Wie Alex Ford sagte:

Ich muss noch hinzufügen, in der Hoffnung, dass jemand anderes das Problem schneller löst und nicht jede Haarsträhne auf dem Kopf herausziehen möchte, wie ich es fast getan hätte.

Ich hatte eine spezielle Version dieses Problems, die wie folgt gelöst werden konnte:

Ausnahmedetails: System.InvalidOperationException: Die Sequenz enthält keine Elemente

Dieser Fehler wird durch die Tatsache verursacht, dass es 2 Projekte mit App_Start / NinjectWebCommon.cs gibt

Durch Entfernen der Datei wird der Fehler behoben.

Hinweis: Wenn Sie Ninject.Web.Common nicht erhalten, weil Sie für eines Ihrer Klassenbibliotheksprojekte auf die Ninject.Web.Common-Assembly verweisen müssen, können Sie den Ordner "App_Start" und "NinjectWebCommon.cs" sicher entfernen. Es ist für Web / Web-API-Projekte gedacht.

> Klicken Sie hier, um den ursprünglichen Blogeintrag anzuzeigen <

Wowe
quelle
Nachdem ich den Namespace meiner Projekte geändert hatte, stieß ich heute erneut auf dasselbe Problem. Alle Lösungen hier haben nicht geholfen. Reinigung und Wiederaufbau haben nicht geholfen. Aber was geholfen hat, war das Löschen der Ordner bin und obj meines Projekts. Es scheint, als ob noch einige Teile des alten Namespace-Teils darin stecken, die bei einer Reinigung nicht gelöscht wurden.
Wowe
Hallo Da_Wolf, das ist es. Danke dir. Sie haben mein Problem gelöst
VivekDev
2

Meine Lösung bestand darin, dass ich die Ordnereigenschaft App_Start, Namespace Provider, auf True gesetzt hatte.

Ich hatte dies in False geändert, damit Resharper den Namespace nicht hervorhebt, der NICHT mit der Ordnerstruktur übereinstimmt.

PhilAI
quelle
Das war es für mich, was mich verrückt machte.
Rashleighp
2

Wollte noch eine Ursache hinzufügen ...

Wir haben das Ninject.MVC3-Paket in mehreren Projekten installiert - von denen nur eines eine tatsächliche MVC-Anwendung war. Wir haben jedoch vergessen, den Ordner App_Start zu entfernen.

Durch Entfernen des Ordners App_Start aus dem referenzierten Projekt wurde das Problem behoben.

fordareh
quelle
Ja! Das war's! Ich hatte fälschlicherweise eine zweite Ninjectwebcommon.cs-Datei auf einem anderen Porject hinzugefügt! Das war es (mit MVC 5)
Jose A
1

Um auf die Antwort von @ Chev einzugehen ... das war auch mein ultimatives Problem. Wenn Sie auf einer Azure-Website (jetzt AppSite) bereitstellen, möchten Sie in der Veröffentlichung auf dieses Feld klicken, um alte Dateien zu entfernen

In Azure-Screenshot veröffentlichen

Viggity
quelle
Dies ist genau das gleiche Bild, das ich posten wollte! Ich wünschte, ich hätte zu dieser Antwort gescrollt, aber die obigen Antworten führen mich zu dieser Idee. +1
Jess