Ninject + MVC3 = InvalidOperationException: Sıra öğe içermiyor


90

Yeni bir MVC3 projesi oluşturdum, F5'e bastım, örnek sayfayı gördüm.

Sonra Ninject.MVC uzantısını almak için NuGet'i kullandım . Global.asax'ımı Ninject belgelerine göre değiştirdim, MVC3 Uygulaması Nasıl Kurulur :

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

Şimdi uygulamayı çalıştırdığımda, aşağıdaki istisna dışında sarı ölüm ekranı görüyorum:

InvalidOperationException - Sıra öğe içermiyor.

System.Linq.Enumerable.Single (...) şirketinde

Ninject.Web.Mvc.Bootstrapper.Initialize (...) satır 67'de.

Ve tabii ki, bu dosyanın 67. satırı .Single () 'i çağırır, böylece istisna atılır.

Neyi yanlış yapıyorum?

Yanıtlar:


101

ninject.mvc3NuGet'i yükledikten sonra App_Startprojenizin içinde bir NinjectMVC3.csdosya içeren bir alt klasörün yaratıldığını fark edebilirsiniz . Bu klasörü silin ve tekrar deneyin. İşte izlediğim adımlar:

  1. Varsayılan şablonu kullanarak yeni bir ASP.NET MVC 3 projesi oluşturun
  2. Paket Yöneticisi Konsolu penceresini açın (Görünüm -> Diğer Pencereler -> Paket Yöneticisi Konsolu)
  3. Tip install-package ninject.mvc3komut satırında
  4. Varsayılan kodu Global.asaxsorunuzdaki kodla değiştirin
  5. AppStartPaketin yüklenmesi sırasında oluşturulan alt klasörü silin
  6. Uygulamayı çalıştırın
  7. /Home/IndexGoogle Chrome web tarayıcınızda açılan varsayılan sayfanın güzelliğinin keyfini çıkarın :-)

3
İşe yaradı. Neden bilmiyorum Hataları anlamadan düzeltmeyi sevmiyorum ... ama teşekkürler, bu beni engelliyor.
Judah Gabriel Himango

19
Bu bir hata değil. NuGet paketi yalnızca çekirdeği kurmanın başka bir yolunu kullanır, böylece global.asax 'ı değiştirmek zorunda kalmaz. Uygulamanız aynı anda her iki yolu da kullandı, bu da uzantıyı iki kez başlatıldığı için geçersiz duruma getirdi.
Remo Gloor

Yararlı açıklama için teşekkürler, Remo.
Judah Gabriel Himango

4
Bunu çözmek için doğru yolu nedir olmadan App_Start klasörü silme?
Ryan Lundy

12
@Kyralessa, Global.asax'ı olduğu gibi bırakarak (türetmeden NinjectHttpApplication) ve kerneli ~/App_Start/NinjectMVC3.csdosyada yapılandırarak ( RegisterServicesyöntem).
Darin Dimitrov

120

Buna, bir başkasının sorunu daha çabuk çözeceğini ve neredeyse yaptığım gibi kafasındaki her saç telini çıkarmak istemeyeceğini ümit ederek eklemeliyim.

Yeni iş şartlarına uyması için projemdeki her şeyi yeniden adlandırmam gerekiyordu. Ad alanlarını her yerde değiştirdim ve hatta Oluşturulan montajın yeni adlandırma kuralına uyması için Montaj Adını (proje> özellikler> uygulama sekmesine sağ tıklayın) değiştirdim. Montajın yeniden adlandırılması Ninject'i çok kızdıran şeydi!

Oluşturulan derlemeyi yeniden adlandırarak, derlediğimizde yeni adla yeni bir dosya oluşturuluyordu. Ancak, eski isimli eski dosya hala bin dizinindeydi! Ninject'in App_Start'ta eklenen sınıf aracılığıyla etkinleştirilmesi durumunda, bu etkinleştirme sınıfı BOTH derlemelerinde çağrılacaktır (eski olan VE yeni yeniden adlandırılmış olan). Bana nasıl veya neden diye sormayın, ama oluyor ve size bu "zaten başlatılmış" hatayı veriyor.

Temizleme çözümü bile işe yaramaz çünkü Visual Studio, yalnızca yeni yeniden adlandırılmış ikili dosyalar oluşturduğu ikili dosyaları kaldırır. Eskileri orada öylece yalnız bırakıyor.

Başka bir şey yapmayı denemeden önce bin klasörünüzü silin! Umarım bu, bir başkasını değerli çalışma saatlerini boşa harcamaktan kurtarır!


7
Cevabını bulana kadar 40 dakika harcadım. Teşekkürler Alex!
Maxim V. Pavlov

3
Kabul edilen cevap benim için yapmadı ama bu yaptı. Teşekkürler Alex.
Pluc

2
Çok teşekkür ederim! Bu konuda bir saat yandım ve cevabınız olmasa çok daha fazlasını yakardım. Bu, uygun soruya doğru cevap olmalıdır.
Doug

2
Parlak! Teşekkürler Alex. Bunun özüne inmek için o kadar çok zaman harcadım ki, çözümünüz mükemmel çalıştı.
Apogee

3
Bu harikaydı. Çok teşekkür ederim. Tam olarak bunu yaptım, ad alanını tam olarak yeniden adlandırdım ve sorunlarımı bile derlemenin hala bölmede yerleşik olduğu gerçeğine bağlamadım. Çok teşekkür ederim!
David L

23

Bir MVC3 uygulaması kurmanın her iki yolunu da göstermek için sorunuza bağlı dokümantasyon Wiki'sini güncelledim. NuGet paketi için tercih edilen yol olan ikinci seçeneği kullanmanızı öneririm.

NinjectHttpApplication'dan türetmek yerine, paketin yüklenmesi sırasında oluşturulan AppStart klasöründeki NinjectMVC.cs'yi kullanıyor. Bu aynı zamanda çekirdeği oluşturduğunuz ve modüllerinizi yüklediğiniz veya bağlamaları tanımladığınız konumdur.


Çok yardımcı oldu Remo. Zaten bir cevabı işaretlediğim için, sadece sizinkine oy vereceğim ve belki birkaçını da beğeneceğim. Wiki'yi yanıtlarken ve güncellerken yukarıda ve öteye gittiğiniz için teşekkür ederiz.
Judah Gabriel Himango

4

Alex Ford'un dediği gibi:

Buna, bir başkasının sorunu daha çabuk çözeceğini ve neredeyse yaptığım gibi kafasındaki her saç telini çıkarmak istemeyeceğini ümit ederek eklemeliyim.

Bu sorunun şu şekilde çözülebilecek özel bir versiyonuna sahiptim:

Özel Durum Ayrıntıları: System.InvalidOperationException: Sıra öğe içermiyor

Bu hata, App_Start / NinjectWebCommon.cs ile 2 proje olması gerçeğinden kaynaklanmaktadır.

Dosyayı kaldırmak hatayı ortadan kaldırır.

Not: Ninject.Web.Common'u, sınıf kitaplığı projenizden biri için Ninject.Web.Common derlemesine başvurmanız gerektiğinden nu alıyorsanız, “App_Start” klasörünü ve “NinjectWebCommon.cs” dosyasını güvenle kaldırabilirsiniz. Web / web api projeleri içindir.

> orijinal blog girişini görüntülemek için burayı tıklayın <


Projelerimin Ad Alanını değiştirdikten sonra bugün yine aynı problemle karşılaştım. Buradaki tüm çözümler yardımcı olmadı. Temizlik ve yeniden inşa yardımcı olmadı. Ama yardımcı olan, projemin bin ve obj klasörlerini silmekti. Görünüşe göre, eski ad alanı bölümünün temizlemeyle silinmeyen bazı parçaları hala sıkışmış.
WOWE

Merhaba Da_Wolf, İşte bu. Teşekkür ederim. Sen benim sorun çözüldü
VivekDev

2

Çözümüm, App_Start klasör özelliğini, Namespace Provider'ı True olarak ayarlamış olmamdı.

Bunu False olarak değiştirdim, böylece Resharper klasör yapısıyla eşleşmeyen ad alanını vurgulamadı.


Bu benim içindi, beni deli ediyordu.
rashleighp

2

Bir neden daha eklemek istedim ...

Ninject.MVC3 paketini birden çok projeye kurduk - bunlardan yalnızca biri gerçek bir MVC uygulamasıydı. Ancak App_Start klasörünü kaldırmayı unuttuk.

App_Start klasörünün başvurulan projeden kaldırılması sorunu çözdü.


Evet! Bu oydu! Yanlışlıkla ikinci bir Ninjectwebcommon.cs dosyasını başka bir porject üzerine eklemiştim! İşte buydu (MVC 5'i kullanarak)
Jose A

1

@ Chev'in cevabına bağlanmak için ... bu benim de nihai sorunumdu. Bir Azure Web Sitesine (artık AppSite olarak adlandırılıyor) dağıtım yapıyorsanız, eski dosyaları kaldırmak için yayımlamada bu kutuya tıklamak istersiniz.

gök mavisi ekran görüntüsüne yayınla


Bu, göndermek üzere olduğum resmin aynısı! Keşke bu cevaba kaydırsaydım, ama yukarıdaki cevaplar beni bu fikre götürüyor. +1
Jess
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.