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 (...)

на Ninject.Web.Mvc.Bootstrapper.Initialize (...) рядок 67.

І, звичайно, рядок 67 цього файлу викликає .Single (), таким чином видаючи виняток.

Що я роблю не так?

Відповіді:


101

Ви можете помітити, що після встановлення ninject.mvc3NuGet App_Startу вашому проекті створена підпапка, що містить NinjectMVC3.csфайл. Видаліть цю папку та повторіть спробу. Отже, ось кроки, якими я керувався:

  1. Створіть новий проект ASP.NET MVC 3, використовуючи шаблон за замовчуванням
  2. Відкрийте вікно консолі Package Manager (Перегляд -> Інші Windows -> Консоль диспетчера пакетів)
  3. Введіть install-package ninject.mvc3у командному рядку
  4. Замініть код за замовчуванням Global.asaxна код у вашому питанні
  5. Видаліть AppStartпідпапку, створену під час встановлення пакету
  6. Запустіть програму
  7. Насолоджуйтесь красою /Home/Indexсторінки за замовчуванням, відкритої у вашому веб-браузері Google Chrome :-)

3
Це спрацювало. Не знаю чому. Я не люблю виправляти помилки, не розуміючи цього ... але дякую, це розблокує мене.
Джуда Габріель Хіманго

19
Це не помилка. Пакет NuGet використовує лише інший спосіб налаштування ядра, щоб йому не потрібно було змінювати global.asax. Ваша програма використовувала обидва способи одночасно, що переводило розширення у недійсний стан, оскільки воно запускалося два рази.
Remo Gloor 01.03.11

Дякую за корисне пояснення, Ремо.
Джуда Габріель Хіманго 02.03.11

4
Який правильний спосіб вирішити це питання без видалення папки App_Start?
Райан Ланді,

12
@Kyralessa, залишивши Global.asax як є (не походить від NinjectHttpApplication) та налаштувавши ядро ​​у ~/App_Start/NinjectMVC3.csфайлі ( RegisterServicesметод).
Дарін Димитров

120

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

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

Шляхом перейменування збірки, яка генерує, під час компіляції створювався новий файл з новою назвою. Однак старий файл зі старою назвою все ще знаходився в каталозі bin! Якщо у вас активується Ninject через доданий клас в App_Start, тоді цей клас активації буде викликаний в обох збірках (старий І новий перейменований). Не питайте мене, як і чому, але це так, і це видає вам цю "вже ініціалізовану" помилку.

Навіть рішення для очищення не працює, оскільки Visual Studio видалить лише генеровані файли, які буде перейменовано. Це залишає старих наодинці, які просто сидять там.

Видаліть свою папку для сміття, перш ніж спробувати щось робити! Сподіваюсь, це позбавляє когось іншого від втрати цінного робочого часу!


7
Ну, я даремно витратив 40 хвилин, перш ніж натрапив на вашу відповідь. Дякую Алекс!
Павлов Максим Васильович

3
Прийнята відповідь не зробила цього для мене, але ця зробила. Дякую Алекс.
Плук

2
Дуже дякую! Я горів годину з цього питання, і спалив би ще багато інших без вашої відповіді. Це повинна бути правильна відповідь на відповідне питання.
Дуг

2
Блискуче! Дякую Алекс. Я витратив стільки часу, намагаючись докопатися до цього, ваше рішення спрацювало бездоганно.
Апогей

3
Це було фантастично. Дуже дякую. Я зробив саме це, перейменувавши повний простір імен, і навіть не пояснив свої проблеми тим фактом, що збірка все ще була побудована в сміттєвому коді. Велике спасибі!
Девід Л

23

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

Замість того, щоб походити з NinjectHttpApplication, він використовує NinjectMVC.cs у папці AppStart, яка створюється під час встановлення пакету. Це також місце, де ви створюєте ядро ​​і де завантажуєте свої модулі, або де ви визначаєте прив’язки.


Дуже корисно, Ремо. Оскільки я вже позначив відповідь, я просто підтримую вашу, і, можливо, кілька інших ваших. Дякуємо, що відповіли та оновили Вікі.
Джуда Габріель Хіманго 02.03.11

4

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

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

У мене була спеціальна версія цієї проблеми, яку можна було вирішити наступним чином:

Деталі винятку: System.InvalidOperationException: Послідовність не містить елементів

Ця помилка викликана тим, що існує 2 проекти з App_Start / NinjectWebCommon.cs

Видалення файлу усуває помилку.

Примітка: якщо ви отримуєте Ninject.Web.Common, оскільки вам потрібно посилатися на збірку Ninject.Web.Common для одного з ваших проектів бібліотеки класів, ви можете безпечно видалити папку "App_Start" і "NinjectWebCommon.cs". Він призначений для веб / веб-проектів API.

> натисніть тут, щоб переглянути оригінальний запис у блозі <


Після зміни простору імен у своїх проектах я сьогодні знову зіткнувся з тією ж проблемою. Всі рішення тут не допомогли. Прибирання та відновлення не допомогли. Але допомогло видалення папок bin та obj мого проекту. Здається, що в ньому все ще застрягли деякі частини старої частини простору імен, які не були видалені очищенням.
Wowe

Привіт Da_Wolf, ось і все. Дякую. Ви вирішили мою проблему
VivekDev

2

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

Я змінив це на False, щоб Resharper не виділяв простір імен, що НЕ відповідає структурі папок.


Це для мене це зводило мене з розуму.
rashleighp

2

Хотіли додати ще одну причину ...

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

Видалення папки App_Start із вказаного проекту вирішило проблему.


Ага! Це було все! Я помилково додав другий файл Ninjectwebcommon.cs на інший проект! Це було (з використанням MVC 5)
Хосе

1

Щоб взяти на себе відповідь @ Chev ... це теж було моє остаточне питання. Якщо ви розгортаєтесь на веб-сайті Azure (тепер він називається AppSite), ви хочете натиснути це поле у ​​публікації, щоб видалити старі файли

опублікувати на блакитний скріншот


Це точно та сама картинка, яку я збирався розмістити! Шкода, що я прокрутив до цієї відповіді, але наведені вище відповіді наводять мене на цю ідею. +1
Джесс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.