Ninject + MVC3 = InvalidOperationException: अनुक्रम में कोई तत्व नहीं हैं


90

मैंने एक नया MVC3 प्रोजेक्ट बनाया, F5 हिट किया, नमूना पृष्ठ देखा।

फिर मैंने निनजेमेंट का उपयोग निनजेक्ट.वीवीसी विस्तार के लिए किया । मैंने अपने वैश्विक.सैक्स को निन्यूज़ प्रलेखन के अनुसार संशोधित किया, एमवीसी 3 एप्लीकेशन को कैसे सेटअप करें :

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. पैकेज प्रबंधक कंसोल विंडो को लाएं (देखें -> अन्य विंडोज -> पैकेज प्रबंधक कंसोल)
  3. install-package ninject.mvc3कमांड लाइन पर टाइप करें
  4. Global.asaxअपने प्रश्न में कोड के साथ डिफ़ॉल्ट कोड को बदलें
  5. AppStartपैकेज की स्थापना के दौरान बनाए गए सबफ़ोल्डर को हटा दें
  6. एप्लिकेशन चलाएँ
  7. /Home/Indexअपने Google Chrome वेब ब्राउज़र में खोले गए डिफ़ॉल्ट पृष्ठ की सुंदरता का आनंद लें :-)

3
वह काम किया। मुझे पता नहीं क्यों। मुझे इसे समझे बिना बग को ठीक करना पसंद नहीं है ... लेकिन धन्यवाद, यह मुझे अनब्लॉक करता है।
जुदा गेब्रियल हिमंगो

19
यह बग नहीं है। NuGet पैकेज कर्नेल को सेटअप करने के लिए केवल एक और तरीका उपयोग करता है ताकि इसे Global.asax को बदलना न पड़े। आपके एप्लिकेशन ने दोनों तरीकों का एक साथ उपयोग किया है जिसने एक्सटेंशन को अमान्य स्थिति में डाल दिया है क्योंकि इसे दो बार शुरू किया गया है।
रेमो ग्लोर

सहायक स्पष्टीकरण के लिए धन्यवाद, रेमो।
जुडा गेब्रियल हिमंगो

4
App_Start फ़ोल्डर को हटाने के बिना इसे हल करने का सही तरीका क्या है ?
रयान लुंडी

12
@Kyralessa, Global.asax को छोड़कर (इससे व्युत्पन्न नहीं NinjectHttpApplication) और ~/App_Start/NinjectMVC3.csफ़ाइल ( RegisterServicesविधि) में कर्नेल को कॉन्फ़िगर करके ।
डारिन दिमित्रोव

120

मुझे इस उम्मीद में यह जोड़ना है कि कोई और इस मुद्दे को अधिक तेज़ी से सुलझाएगा और अपने सिर पर बालों के प्रत्येक कड़े को बाहर निकालना नहीं चाहेगा जैसे मैंने लगभग किया था।

नई व्यावसायिक शर्तों से मेल खाने के लिए मुझे अपनी परियोजना में हर चीज का नाम बदलने की जरूरत थी। मैंने हर जगह नामस्थान बदल दिए और मैंने असेंबली का नाम (राइट-क्लिक प्रोजेक्ट> प्रॉपर्टीज़> एप्लिकेशन टैब) भी बदल दिया, ताकि उत्पन्न असेंबली नए नामकरण सम्मेलन से मेल खाए। असेंबली का नाम बदल दिया गया है जो निनजे को बहुत नाराज करता है!

असेंबली का नाम बदलने से जो नए नाम के साथ एक नई फ़ाइल उत्पन्न होती है, जब हम संकलित किए जा रहे थे। हालाँकि, पुराने नाम के साथ पुरानी फ़ाइल अभी भी बिन निर्देशिका में थी! यदि आपने Nin_ को App_Start में जोड़े गए वर्ग के माध्यम से सक्रिय किया है, तो यह सक्रियण वर्ग BOTH असेंबली (पुराने एक और नया नाम बदला हुआ) में लागू हो जाएगा। मुझसे मत पूछो कैसे या क्यों, लेकिन यह करता है और यह आपको यह "पहले से ही आरंभिक" त्रुटि देता है।

यहां तक ​​कि सफाई समाधान भी काम नहीं करता है क्योंकि विज़ुअल स्टूडियो केवल उत्पन्न होने वाले बायनेरिज़ को हटा देगा, जो कि नया नाम होगा। यह बूढ़े लोगों को अकेला छोड़ देता है।

कुछ और करने की कोशिश करने से पहले अपने बिन फ़ोल्डर को हटा दें! मुझे आशा है कि यह किसी और को बहुमूल्य काम के घंटे बर्बाद करने से बचाता है!


7
खैर, मैं आपके जवाब पर ठोकर खाने से पहले 40 मिनट बर्बाद कर चुका हूं। धन्यवाद एलेक्स!
मैक्सिम वी। पावलोव

3
स्वीकृत उत्तर ने मेरे लिए ऐसा नहीं किया, लेकिन इसने किया। धन्यवाद एलेक्स।
Pluc

2
आपको बहुत - बहुत धन्यवाद! मैंने इस मुद्दे पर एक घंटा जलाया, और आपकी प्रतिक्रिया के बिना कई और जलाएंगे। यह उपयुक्त प्रश्न का सही उत्तर होना चाहिए।
डग २

2
प्रतिभाशाली! धन्यवाद एलेक्स। मैंने बहुत समय बर्बाद किया इस के तल पर जाने की कोशिश में, आपके समाधान ने पूरी तरह से काम किया।
एपोजी

3
यह शानदार था। बहुत बहुत धन्यवाद। मैंने ठीक यही किया, एक पूर्ण नाम स्थान का नाम बदल दिया और मेरे मुद्दों को भी इस तथ्य के लिए जिम्मेदार नहीं ठहराया कि विधानसभा अभी भी बिन में बनी थी। आपका बहुत बहुत धन्यवाद!
डेविड एल

23

मैंने MVC3 एप्लिकेशन को सेटअप करने के दोनों तरीके दिखाने के लिए आपके प्रश्न में जुड़े दस्तावेज़ विकी को अपडेट किया है। मैं दूसरे विकल्प का उपयोग करने का सुझाव देता हूं जो कि NNGetpackage के लिए पसंदीदा तरीका है।

NinjectHttpApplication से प्राप्त करने के बजाय यह AppStart फ़ोल्डर में NinjectMVC.cs का उपयोग कर रहा है जो पैकेज की स्थापना के दौरान बनाया गया है। यह वह स्थान भी है जहां आप कर्नेल बनाते हैं और जहां आप अपने मॉड्यूल लोड करते हैं या जहां आप बाइंडिंग को परिभाषित करते हैं।


बहुत मददगार, रेमो। चूँकि मैंने पहले से ही एक उत्तर को चिह्नित कर लिया है, मैं सिर्फ आपका उत्थान करूंगा और शायद आप में से कुछ अन्य लोगों का उत्थान हो। विकी को जवाब देने और अपडेट करने में ऊपर और बाहर जाने के लिए धन्यवाद।
यहूदा गैब्रियल हिमंगो

4

जैसा कि एलेक्स फोर्ड ने कहा:

मुझे इस उम्मीद में यह जोड़ना है कि कोई और इस मुद्दे को अधिक तेज़ी से सुलझाएगा और अपने सिर पर बालों के प्रत्येक कड़े को बाहर निकालना नहीं चाहेगा जैसे मैंने लगभग किया था।

मेरे पास उस समस्या का एक विशेष संस्करण था जिसे निम्नानुसार हल किया जा सकता था:

अपवाद विवरण: System.InvalidOperationException: अनुक्रम में कोई तत्व नहीं हैं

यह त्रुटि इस तथ्य के कारण है कि App_Start / NinjectWebCommon.cs के साथ 2 परियोजनाएं हैं

फ़ाइल को हटाने से त्रुटि समाप्त हो जाती है।

नोट: यदि आप nu-getting Ninject.Web.Common कर रहे हैं क्योंकि आपको अपने एक क्लास लाइब्रेरी प्रोजेक्ट के लिए Ninject.Web.Common असेंबली का संदर्भ देने की आवश्यकता है, तो आप "App_Start" फ़ोल्डर और "NinjectWebCommon.cs" को सुरक्षित रूप से हटा सकते हैं। यह वेब / वेब एपीआई परियोजनाओं के लिए है।

> मूल ब्लॉग प्रविष्टि देखने के लिए यहां क्लिक करें <


अपनी परियोजनाओं के नाम स्थान बदलने के बाद मैं आज फिर उसी समस्या में चला गया। यहां सभी समाधानों ने मदद नहीं की। सफाई और पुनर्निर्माण में मदद नहीं मिली। लेकिन जो मदद मिली उसने मेरी परियोजना के बिन और obj फ़ोल्डर को हटा दिया। ऐसा लगता है कि अभी भी पुराने नाम स्थान के कुछ हिस्से इसमें फंस गए हैं जो एक सफाई के साथ हटाए नहीं गए।
वॉव

हाय दा_वुल्फ, यह बात है। धन्यवाद। आपने मेरी समस्या हल कर दी
विवेकदेव

2

मेरा समाधान यह था कि मैंने App_Start फ़ोल्डर गुण, Namespace प्रदाता को True पर सेट किया था।

मैंने इसे बदलकर गलत कर दिया था, ताकि Resharper फ़ोल्डर संरचना से मेल खाने वाले नाम स्थान को उजागर न करे।


यह मेरे लिए था, मुझे पागल कर रहा था।
rashleighp

2

एक और कारण जोड़ना चाहता था ...

हमने कई प्रोजेक्ट्स में Ninject.MVC3 पैकेज स्थापित किया - जिनमें से केवल एक वास्तविक MVC ऐपेटॉन था। हालाँकि, हम App_Start फ़ोल्डर को निकालना भूल गए।

संदर्भित प्रोजेक्ट से App_Start फ़ोल्डर को हटाकर समस्या को हल किया गया।


हाँ! यही था वह! मैंने गलती से एक दूसरे Ninjectwebcommon.cs फ़ाइल को दूसरे पोरजेक्ट पर जोड़ दिया था! यह वह था (MVC 5 का उपयोग करके)
जोस ए

1

@ चेव के जवाब से निपटने के लिए ... यह मेरा अंतिम मुद्दा भी था। यदि आप एक Azure वेबसाइट (जिसे अब AppSite नाम दिया गया है) पर तैनात कर रहे हैं, तो आप पुरानी फ़ाइलों को हटाने के लिए प्रकाशन में इस बॉक्स पर क्लिक करना चाहते हैं

azure स्क्रीनशॉट पर प्रकाशित करें


यह ठीक वही तस्वीर है जो मैं पोस्ट करने वाला था! काश मैंने इस उत्तर को नीचे स्क्रॉल किया होता, लेकिन उपरोक्त उत्तर मुझे इस विचार की ओर ले जाते हैं। +1
जेस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.