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

90

Я создал новый проект 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 (...)

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

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

Что я делаю не так?

Иуда Габриэль Химанго
источник

Ответы:

101

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

  1. Создайте новый проект ASP.NET MVC 3, используя шаблон по умолчанию
  2. Откройте окно консоли диспетчера пакетов (Вид -> Другие окна -> Консоль диспетчера пакетов)
  3. Введите install-package ninject.mvc3в командной строке
  4. Замените код по умолчанию Global.asaxна код вашего вопроса
  5. Удалите AppStartподпапку, созданную при установке пакета.
  6. Запустить приложение
  7. Наслаждайтесь красотой /Home/Indexстраницы по умолчанию, открытой в вашем браузере Google Chrome :-)
Дарин Димитров
источник
3
Это сработало. Не знаю почему. Я не люблю исправлять ошибки, не понимая этого ... но спасибо, это меня разблокирует.
Иуда Габриэль Химанго 01
19
Это не ошибка. Пакет NuGet использует только другой способ настройки ядра, так что ему не нужно изменять global.asax. Ваше приложение использовало оба способа одновременно, что переводило расширение в недопустимое состояние, поскольку оно запускалось два раза.
Remo Gloor 01
Спасибо за полезное объяснение, Ремо.
Иуда Габриэль Химанго 02
4
Как правильно решить эту проблему, не удаляя папку App_Start?
Райан Ланди
12
@Kyralessa, оставив Global.asax как есть (не производный NinjectHttpApplication) и настроив ядро ​​в ~/App_Start/NinjectMVC3.csфайле ( RegisterServicesметоде).
Дарин Димитров
120

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

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

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

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

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

Чев
источник
7
Ну, я потратил около 40 минут, прежде чем наткнулся на твой ответ. Спасибо, Алекс!
Максим В. Павлов
3
Принятый ответ не помог мне, а вот этот. Спасибо, Алекс.
Pluc
2
Спасибо огромное! Я потратил час на эту проблему, и без вашего ответа я бы прожил еще много. Это должен быть правильный ответ на соответствующий вопрос.
Дуг
2
Гениально! Спасибо, Алекс. Я потратил столько времени, пытаясь разобраться в этом, ваше решение сработало отлично.
Apogee
3
Это было фантастически. Огромное спасибо. Я сделал именно это, полное переименование пространства имен и даже не стал связывать свои проблемы с тем, что сборка все еще была построена в корзине. Большое спасибо!
Дэвид Л.
23

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

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

Ремо Глор
источник
Очень полезно, Ремо. Поскольку я уже отметил ответ, я просто проголосую за ваш и, возможно, за несколько других. Спасибо, что сделали все возможное, отвечая на вопросы и обновляя Wiki.
Иуда Габриэль Химанго 02
4

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

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

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

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

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

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

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

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

Вау
источник
После изменения пространства имен моих проектов сегодня я снова столкнулся с той же проблемой. Все решения здесь не помогли. Очистка и восстановление не помогли. Но что помогло, так это удаление папок bin и obj моего проекта. Похоже, что в нем все еще застряли некоторые части старой части пространства имен, которые не были удалены при очистке.
Wowe,
Привет, Da_Wolf, вот и все. Спасибо. Вы решили мою проблему
VivekDev
2

Мое решение заключалось в том, что я установил для свойства папки App_Start, Namespace Provider значение True.

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

PhilAI
источник
Это было то, что сводило меня с ума.
rashleighp 01
2

Хотел добавить еще одну причину ...

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

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

Fordareh
источник
Да уж! Это было оно! Я по ошибке добавил второй файл Ninjectwebcommon.cs в другой проект! Это было (с использованием MVC 5)
Jose A
1

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

опубликовать в лазурном скриншоте

энергичность
источник
Это та самая фотография, которую я собирался опубликовать! Хотел бы я прокрутить вниз до этого ответа, но приведенные выше ответы привели меня к этой идее. +1
Джесс