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?
źródło
NinjectHttpApplication
) i konfigurując jądro w~/App_Start/NinjectMVC3.cs
pliku (RegisterServices
metoda).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!
źródło
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.
źródło
Jak powiedział Alex Ford:
Miałem specjalną wersję tego problemu, którą można było rozwiązać w następujący sposób:
źródło
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.
źródło
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.
źródło
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
źródło