Ninject + MVC3 = InvalidOperationException: Urutan tidak mengandung elemen

90

Saya membuat proyek MVC3 baru, tekan F5, lihat halaman sampel.

Kemudian saya menggunakan NuGet untuk mendapatkan ekstensi Ninject.MVC . Saya memodifikasi global.asax saya sesuai dengan dokumentasi Ninject, Cara Mengatur Aplikasi 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);
   }
}

Sekarang ketika saya menjalankan aplikasi, saya mendapatkan layar kuning kematian dengan pengecualian berikut:

InvalidOperationException - Urutan tidak berisi elemen.

di System.Linq.Enumerable.Single (...)

di Ninject.Web.Mvc.Bootstrapper.Initialize (...) baris 67.

Dan benar saja, baris 67 dari file itu memanggil .Single (), sehingga memunculkan pengecualian.

Apa yang saya lakukan salah?

Judah Gabriel Himango
sumber

Jawaban:

101

Anda mungkin memperhatikan bahwa setelah menginstal ninject.mvc3NuGet ada App_Startsubfolder yang dibuat di dalam proyek Anda yang berisi NinjectMVC3.csfile. Hapus folder ini dan coba lagi. Jadi inilah langkah-langkah yang saya ikuti:

  1. Buat proyek ASP.NET MVC 3 baru menggunakan templat default
  2. Munculkan jendela Package Manager Console (View -> Other Windows -> Package Manager Console)
  3. Ketik install-package ninject.mvc3di baris perintah
  4. Ganti kode default Global.asaxdengan kode di pertanyaan Anda
  5. Hapus AppStartsubfolder yang dibuat selama penginstalan paket
  6. Jalankan aplikasinya
  7. Nikmati keindahan /Home/Indexhalaman default yang dibuka di browser web Google Chrome Anda :-)
Darin Dimitrov
sumber
3
Itu berhasil. Saya tidak tahu kenapa. Saya tidak suka memperbaiki bug tanpa memahaminya ... tapi terima kasih, ini membebaskan saya.
Judah Gabriel Himango
19
Ini bukan bug. Paket NuGet hanya menggunakan cara lain untuk mengatur kernel sehingga tidak perlu mengubah global.asax. Aplikasi Anda menggunakan kedua cara secara bersamaan yang menempatkan ekstensi dalam status tidak valid karena dimulai dua kali.
Remo Gloor
Terima kasih atas penjelasannya yang bermanfaat, Remo.
Judah Gabriel Himango
4
Apa cara yang benar untuk mengatasi ini tanpa menghapus folder App_Start?
Ryan Lundy
12
@Kyralessa, dengan meninggalkan Global.asax apa adanya (bukan berasal dari NinjectHttpApplication) dan mengkonfigurasi kernel di ~/App_Start/NinjectMVC3.csfile ( RegisterServicesmetode).
Darin Dimitrov
120

Saya harus menambahkan ini dengan harapan orang lain akan menyelesaikan masalah lebih cepat dan tidak ingin mencabut setiap helai rambut di kepala mereka seperti yang hampir saya lakukan.

Saya perlu mengganti nama semua dalam proyek saya agar sesuai dengan istilah bisnis baru. Saya mengubah ruang nama di mana-mana dan saya bahkan mengubah Nama Majelis (proyek klik kanan> properti> tab aplikasi) sehingga perakitan yang dihasilkan cocok dengan konvensi penamaan baru. Perakitan ulang nama inilah yang membuat Ninject sangat marah!

Dengan mengganti nama rakitan yang menghasilkan file baru dengan nama baru yang dibuat saat kita mengkompilasi. Namun, file lama dengan nama lama masih ada di direktori bin! Jika Anda mengaktifkan Ninject melalui kelas yang ditambahkan di App_Start, maka kelas aktivasi ini akan dipanggil di KEDUA rakitan (yang lama DAN yang baru diganti namanya). Jangan tanya saya bagaimana atau mengapa, tapi ya dan itu memberi Anda kesalahan "sudah diinisialisasi" ini.

Bahkan solusi pembersihan tidak berfungsi karena Visual Studio hanya akan menghapus biner yang dihasilkannya, yang akan menjadi yang baru diganti namanya. Itu meninggalkan yang lama sendirian hanya duduk di sana.

Hapus folder bin Anda sebelum Anda mencoba melakukan hal lain! Saya harap ini menyelamatkan orang lain dari membuang-buang jam kerja yang berharga!

Chev
sumber
7
Yah, saya telah menyia-nyiakan waktu 40 menit sebelum saya menemukan jawaban Anda. Terima kasih Alex!
Maxim V. Pavlov
3
Jawaban yang diterima tidak melakukannya untuk saya tetapi yang ini berhasil. Terima kasih Alex.
Pluc
2
Terima kasih banyak! Saya menghabiskan satu jam untuk masalah ini, dan akan membakar lebih banyak lagi tanpa tanggapan Anda. Ini harus menjadi jawaban yang benar untuk pertanyaan yang sesuai.
Doug
2
Cemerlang! Terima kasih Alex. Saya membuang banyak waktu untuk mencoba menyelesaikan masalah ini, solusi Anda bekerja dengan sempurna.
Apogee
3
Ini luar biasa. Terima kasih banyak. Saya melakukan hal ini dengan tepat, mengganti nama namespace penuh dan bahkan tidak menghubungkan masalah saya dengan fakta bahwa assembly masih dibangun di tempat sampah. Terima kasih banyak!
David L
23

Saya telah memperbarui dokumentasi Wiki yang ditautkan dalam pertanyaan Anda untuk menunjukkan kedua cara menyiapkan aplikasi MVC3. Saya menyarankan untuk menggunakan opsi kedua yang merupakan cara yang disukai untuk theNuGetpackage.

Alih-alih berasal dari NinjectHttpApplication, ia menggunakan NinjectMVC.cs di folder AppStart yang dibuat selama penginstalan paket. Ini juga merupakan lokasi tempat Anda membuat kernel dan tempat Anda memuat modul atau tempat Anda menentukan binding.

Remo Gloor
sumber
Sangat membantu, Remo. Karena saya sudah menandai jawaban, saya hanya akan memberi suara positif untuk Anda dan mungkin memberi suara positif beberapa jawaban Anda. Terima kasih telah melangkah lebih jauh dalam menjawab dan memutakhirkan Wiki.
Judah Gabriel Himango
4

Seperti yang dikatakan Alex Ford:

Saya harus menambahkan ini dengan harapan orang lain akan menyelesaikan masalah lebih cepat dan tidak ingin mencabut setiap helai rambut di kepala mereka seperti yang hampir saya lakukan.

Saya memiliki versi khusus dari masalah itu yang dapat diselesaikan sebagai berikut:

Detail Pengecualian: System.InvalidOperationException: Urutan tidak berisi elemen

Kesalahan ini disebabkan oleh fakta bahwa ada 2 project dengan App_Start / NinjectWebCommon.cs

Menghapus file menghilangkan kesalahan.

Catatan: jika Anda mencari Ninject.Web.Common karena Anda perlu mereferensikan perakitan Ninject.Web.Common untuk salah satu proyek perpustakaan kelas Anda, Anda dapat dengan aman menghapus folder "App_Start" dan "NinjectWebCommon.cs". Ini dimaksudkan untuk proyek api web / web.

> klik di sini untuk melihat entri blog asli <

Wowe
sumber
Setelah mengubah Namespace proyek saya, hari ini saya mengalami masalah yang sama lagi. Semua solusi di sini tidak membantu. Pembersihan & pembangunan kembali tidak membantu. Tapi yang membantu adalah menghapus folder bin dan obj dari proyek saya. Sepertinya masih ada beberapa bagian dari namespace lama di dalamnya yang tidak terhapus dengan pembersihan.
Wowe
Hai Da_Wolf, Itu dia. Terima kasih. Anda memecahkan masalah saya
VivekDev
2

Solusi saya adalah saya telah menyetel properti folder App_Start, Penyedia Ruangnama ke True.

Saya telah mengubahnya menjadi False sehingga Resharper tidak akan menyorot namespace TIDAK cocok dengan struktur folder.

PhilAI
sumber
Ini untukku, membuatku gila.
rashleighp
2

Ingin menambahkan satu alasan lagi ...

Kami menginstal paket Ninject.MVC3 ke beberapa proyek - hanya satu yang merupakan aplikasi MVC yang sebenarnya. Namun, kami lupa menghapus folder App_Start.

Menghapus folder App_Start dari proyek yang direferensikan menyelesaikan masalah.

fordareh
sumber
Ya! Ini dia! Saya telah salah menambahkan file Ninjectwebcommon.cs kedua di porject lain! Ini dia (Menggunakan MVC 5)
Jose A
1

Untuk mengikuti jawaban @ Chev ... ini adalah masalah terakhir saya juga. Jika Anda menerapkan ke Situs Web Azure (sekarang bernama AppSite), Anda ingin mengklik kotak ini di terbitkan untuk menghapus file lama

publikasikan ke tangkapan layar biru

viggity
sumber
Ini adalah gambar yang sama persis dengan yang akan saya posting! Saya berharap saya telah menggulir ke bawah ke jawaban ini, tetapi jawaban di atas membawa saya ke ide ini. +1
Jess