Ninject + MVC3 = InvalidOperationException: Последовательность не содержит элементов

Я создал новый проект MVC3, нажав F5, увидел образец страницы.

Затем я использовал NuGet для получения расширения Ninject.MVC. Я изменил свой файл global.asax в соответствии с документацией Ninject, Как настроить приложение MVC3:

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

Теперь, когда я запускаю приложение, я получаю желтый экран смерти со следующим исключением:

InvalidOperationException - Последовательность не содержит элементов.

в System.Linq.Enumerable.Single(...)

в Ninject.Web.Mvc.Bootstrapper.Initialize(...) строка 67.

И конечно, строка 67 этого файла вызывает .Single(), тем самым бросая исключение.

Что я делаю неправильно?

Ответ 1

Возможно, вы заметили, что после установки ninject.mvc3 NuGet в вашем проекте есть подпапка App_Start, содержащая файл NinjectMVC3.cs. Удалите эту папку и повторите попытку. Итак, вот шаги, которые я выполнил:

  • Создайте новый проект ASP.NET MVC 3 с использованием шаблона по умолчанию
  • Поднимите окно консоли диспетчера пакетов (View → Other Windows → Console Manager)
  • Введите install-package ninject.mvc3 в командной строке
  • Замените код по умолчанию в Global.asax кодом вашего вопроса
  • Удалить подпапку AppStart, созданную во время установки пакета
  • Запустите приложение
  • Наслаждайтесь красотой страницы /Home/Index по умолчанию, открытой в вашем браузере Google Chrome: -)

Ответ 2

Я должен добавить к этому в надежде, что кто-то еще решит проблему быстрее и не захочет вытащить каждую прядь волос на голове, как я почти сделал.

Мне нужно было переименовать все в моем проекте в соответствии с новыми бизнес-условиями. Я изменил пространства имен повсюду, и я даже изменил название Assembly (щелкните правой кнопкой мыши проект > свойствa > вкладка приложения), чтобы сгенерированная сборка соответствовала новому соглашению об именах. Переименование сборки - вот что сделало Ninject очень злым!

Переименовывая сборку, которая генерируется, при сборке создается новый файл с новым именем. Однако старый файл со старым именем все еще находился в каталоге bin! Если вы активируете Ninject через добавленный класс в App_Start, этот класс активации будет вызван в BOTH-сборках (старый и новый переименованный). Не спрашивайте меня, как и почему, но это происходит, и это дает вам эту "уже инициализированную" ошибку.

Даже чистящее решение не работает, потому что Visual Studio будет удалять только исполняемые файлы, которые будут созданы, что будет новым переименованным. Он оставляет только те, кто сидит там.

Снова удалите папку с папкой, прежде чем пытаться сделать что-нибудь еще! Надеюсь, это избавит кого-то другого от потери ценного рабочего времени!

Ответ 3

Я обновил документацию Wiki, связанную в вашем вопросе, чтобы показать оба способа настройки приложения MVC3. Я предлагаю использовать второй вариант, который является предпочтительным способом для NuGetpackage.

Вместо вывода из NinjectHttpApplication используется NinjectMVC.cs в папке AppStart, которая создается во время установки пакета. Это также место, где вы создаете ядро ​​и где вы загружаете свои модули или где вы определяете привязки.

Ответ 4

Как сказал Алекс Форд:

Я должен добавить к этому в надежде, что кто-то другой разрешит быстрее и не хотите вытаскивать каждую прядь волос на их голова, как я, почти сделал.

У меня была специальная версия этой проблемы, которая могла бы быть решена следующим образом:

Сведения об исключении: System.InvalidOperationException: Последовательность не содержит элементов

Эта ошибка вызвана тем, что есть 2 проекта с App_Start/NinjectWebCommon.cs

Удаление файла устраняет ошибку.

Примечание: если вы nu-получение Ninject.Web.Common, потому что вам нужно ссылка Ninject.Web.Common для одной из ваших классов проекта, вы можете безопасно удалить папку "App_Start" и "NinjectWebCommon.cs". Он предназначен для проектов web/web api.

> нажмите здесь, чтобы посмотреть исходную запись в блоге <

Ответ 5

Мое решение состояло в том, что я установил свойство папки App_Start, поставщик пространства имен - True.

Я изменил это на False, чтобы Resharper не выделял пространство имен, не соответствующее структуре папок.

Ответ 6

Требуется добавить еще одну причину...

Мы установили пакет Ninject.MVC3 в несколько проектов - только один из них был фактическим приложением MVC. Однако мы забыли удалить папку App_Start.

Удаление папки App_Start из указанного проекта разрешило проблему.

Ответ 7

Чтобы ответить на @Chev ответ... это была моя последняя проблема. Если вы развертываете сайт Azure (теперь называемый AppSite), вы хотите нажать на это поле в публикации, чтобы удалить старые файлы.

опубликовать на azure screenshot