Ninject + MVC3 = InvalidOperationException: Sekwencja nie zawiera żadnych elementów

90

Stworzyłem nowy projekt MVC3, uderzyłem F5, zobaczyłem przykładową stronę.

Następnie użyłem NuGet, aby uzyskać rozszerzenie Ninject.MVC . Zmodyfikowałem plik global.asax zgodnie z dokumentacją 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);
   }
}

Teraz, gdy uruchamiam aplikację, pojawia się żółty ekran śmierci z następującym wyjątkiem:

InvalidOperationException - Sekwencja nie zawiera żadnych elementów.

w System.Linq.Enumerable.Single (...)

w Ninject.Web.Mvc.Bootstrapper.Initialize (...) linia 67.

I rzeczywiście, linia 67 tego pliku wywołuje .Single (), rzucając w ten sposób wyjątek.

Co ja robię źle?

Judah Gabriel Himango
źródło

Odpowiedzi:

101

Możesz zauważyć, że po zainstalowaniu ninject.mvc3NuGet istnieje App_Startpodfolder utworzony w projekcie zawierający NinjectMVC3.csplik. Usuń ten folder i spróbuj ponownie. Oto kroki, które wykonałem:

  1. Utwórz nowy projekt ASP.NET MVC 3 przy użyciu domyślnego szablonu
  2. Wyświetl okno konsoli Menedżera pakietów (Widok -> Inne okna -> Konsola Menedżera pakietów)
  3. Wpisz install-package ninject.mvc3w wierszu poleceń
  4. Zastąp kod domyślny kodem Global.asaxz pytania
  5. Usuń AppStartpodfolder utworzony podczas instalacji pakietu
  6. Uruchom aplikację
  7. Ciesz się pięknem /Home/Indexdomyślnej strony otwartej w przeglądarce Google Chrome :-)
Darin Dimitrov
źródło
3
To się udało. Nie wiem dlaczego. Nie lubię naprawiać błędów bez zrozumienia tego ... ale dzięki, to mnie odblokowuje.
Judah Gabriel Himango
19
To nie jest błąd. Pakiet NuGet używa tylko innego sposobu konfiguracji jądra, aby nie musiało zmieniać pliku global.asax. Twoja aplikacja użyła obu sposobów jednocześnie, co spowodowało, że rozszerzenie było nieprawidłowe, ponieważ zostało uruchomione dwa razy.
Remo Gloor
Dziękuję za pomocne wyjaśnienie, Remo.
Judah Gabriel Himango
4
Jaki jest właściwy sposób rozwiązania tego problemu bez usuwania folderu App_Start?
Ryan Lundy
12
@Kyralessa, pozostawiając Global.asax takim, jakim jest (nie pochodzi z NinjectHttpApplication) i konfigurując jądro w ~/App_Start/NinjectMVC3.cspliku ( RegisterServicesmetoda).
Darin Dimitrov
120

Muszę do tego dodać w nadziei, że ktoś inny szybciej rozwiąże problem i nie będzie chciał wyrywać mu każdego kosmyka włosów z głowy, tak jak ja prawie to zrobiłem.

Musiałem zmienić nazwę wszystkiego w moim projekcie, aby dopasować ją do nowych warunków biznesowych. Zmieniłem przestrzenie nazw wszędzie, a nawet zmieniłem nazwę zestawu (kliknij prawym przyciskiem myszy projekt> właściwości> karta aplikacji), aby wygenerowany zestaw był zgodny z nową konwencją nazewnictwa. Zmiana nazwy zespołu bardzo rozzłościła Ninject!

Zmieniając nazwę zestawu, który jest generowany, podczas kompilacji tworzony był nowy plik o nowej nazwie. Jednak stary plik o starej nazwie nadal znajdował się w katalogu bin! Jeśli masz Ninject aktywujący się za pośrednictwem dodanej klasy w App_Start, ta klasa aktywacji zostanie wywołana w OBU zespołach (stara ORAZ nowa o zmienionej nazwie). Nie pytaj mnie, jak i dlaczego, ale tak się dzieje i wyświetla ten błąd „już zainicjowany”.

Nawet rozwiązanie czyszczące nie działa, ponieważ program Visual Studio usunie tylko generowane pliki binarne, które będą nowymi zmienionymi nazwami. Pozostawia starych samych po prostu tam siedzących.

Usuń folder bin, zanim spróbujesz zrobić cokolwiek innego! Mam nadzieję, że dzięki temu ktoś nie będzie tracił cennych godzin pracy!

Chev
źródło
7
Cóż, straciłem 40 minut, zanim natknąłem się na twoją odpowiedź. Dzięki Alex!
Maxim V. Pavlov
3
Zaakceptowana odpowiedź nie zrobiła tego za mnie, ale ta. Dzięki Alex.
Pluc
2
Dziękuję bardzo! Spaliłem godzinę w tej sprawie i bez twojej odpowiedzi spaliłbym znacznie więcej. To powinna być poprawna odpowiedź na właściwe pytanie.
Doug
2
Znakomity! Dzięki Alex. Zmarnowałem tyle czasu, próbując dotrzeć do sedna tego, twoje rozwiązanie zadziałało idealnie.
Apogeum
3
To było fantastyczne. Dziękuję bardzo. Zrobiłem dokładnie to, pełną zmianę nazwy przestrzeni nazw i nawet nie przypisałem moich problemów do faktu, że zespół był nadal zbudowany w bin. Dziękuję Ci bardzo!
David L
23

Zaktualizowałem dokumentację Wiki, do której odsyłasz w Twoim pytaniu, aby pokazać oba sposoby konfiguracji aplikacji MVC3. Proponuję skorzystać z drugiej opcji, która jest preferowaną metodą dla pakietu NuGet.

Zamiast wywodzić się z NinjectHttpApplication, używa NinjectMVC.cs w folderze AppStart, który jest tworzony podczas instalacji pakietu. Jest to również lokalizacja, w której tworzysz jądro i w którym ładujesz swoje moduły lub definiujesz powiązania.

Remo Gloor
źródło
Bardzo pomocny, Remo. Ponieważ już zaznaczyłem odpowiedź, po prostu zagłosuję za Twoją i może kilka innych Twoich. Dziękuję za wykraczanie poza granice w udzielaniu odpowiedzi i aktualizowaniu Wiki.
Judah Gabriel Himango
4

Jak powiedział Alex Ford:

Muszę do tego dodać w nadziei, że ktoś inny szybciej rozwiąże problem i nie będzie chciał wyrywać mu każdego kosmyka włosów z głowy, tak jak ja prawie to zrobiłam.

Miałem specjalną wersję tego problemu, którą można było rozwiązać w następujący sposób:

Szczegóły wyjątku: System.InvalidOperationException: Sekwencja nie zawiera żadnych elementów

Ten błąd jest spowodowany faktem, że istnieją 2 projekty z App_Start / NinjectWebCommon.cs

Usunięcie pliku eliminuje błąd.

Uwaga: jeśli nie pobierasz Ninject.Web.Common, ponieważ musisz odwołać się do zestawu Ninject.Web.Common dla jednego z projektów biblioteki klas, możesz bezpiecznie usunąć folder „App_Start” i „NinjectWebCommon.cs”. Jest przeznaczony do projektów web / web api.

> kliknij tutaj, aby wyświetlić oryginalny wpis na blogu <

Wowe
źródło
Po zmianie Przestrzeni nazw moich projektów napotkałem dziś ponownie ten sam problem. Wszystkie rozwiązania tutaj nie pomogły. Czyszczenie i odbudowa nie pomogły. Ale pomogło usunięcie folderów bin i obj mojego projektu. Wygląda na to, że nadal są w nim zablokowane fragmenty starej części przestrzeni nazw, które nie zostały usunięte podczas czyszczenia.
Wowe
Cześć Da_Wolf, to wszystko. Dziękuję Ci. Rozwiązałeś mój problem
VivekDev
2

Moje rozwiązanie polegało na tym, że ustawiłem właściwość folderu App_Start, Namespace Provider na True.

Zmieniłem to na False, aby Resharper nie podświetlał przestrzeni nazw NIE pasującej do struktury folderów.

PhilAI
źródło
To było to dla mnie, doprowadzając mnie do szaleństwa.
rashleighp
2

Chciałem dodać jeszcze jedną przyczynę ...

Zainstalowaliśmy pakiet Ninject.MVC3 w wielu projektach - tylko jeden z nich był rzeczywistą aplikacją MVC. Jednak zapomnieliśmy usunąć folder App_Start.

Usunięcie folderu App_Start z przywoływanego projektu rozwiązało problem.

fordareh
źródło
Tak! To było to! Pomyłkowo dodałem drugi plik Ninjectwebcommon.cs do innego obiektu! To było to (przy użyciu MVC 5)
Jose A
1

Aby skorzystać z odpowiedzi @ Chev ... to był również mój ostateczny problem. Jeśli wdrażasz w witrynie internetowej platformy Azure (teraz o nazwie AppSite), chcesz kliknąć to pole w publikacji, aby usunąć stare pliki

Opublikuj na azure zrzut ekranu

żywotność
źródło
To jest dokładnie to samo zdjęcie, które miałem zamieścić! Żałuję, że nie przewinięto do tej odpowiedzi, ale powyższe odpowiedzi prowadzą mnie do tego pomysłu. +1
Jess