Ninject + MVC3 = InvalidOperationException: последовательность не содержит элементов - PullRequest
89 голосов
/ 02 марта 2011

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

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

Ответы [ 7 ]

120 голосов
/ 01 марта 2012

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

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

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

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

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

101 голосов
/ 02 марта 2011

Вы можете заметить, что после установки ninject.mvc3 NuGet внутри вашего проекта создается подпапка 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: -)
23 голосов
/ 02 марта 2011

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

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

4 голосов
/ 23 апреля 2014

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

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

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

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

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

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

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

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

2 голосов
/ 26 ноября 2014

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

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

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

2 голосов
/ 22 мая 2014

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

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

1 голос
/ 07 декабря 2015

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

publish to azure screenshot

...