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 เริ่มต้น (... ) บรรทัดที่ 67

และนั่นเองบรรทัดที่ 67 ของการเรียกใช้ไฟล์นั้น Single () จึงทำให้เกิดข้อยกเว้น

ผมทำอะไรผิดหรือเปล่า?

คำตอบ:


101

คุณอาจสังเกตเห็นว่าหลังจากติดตั้งninject.mvc3NuGet แล้วจะมีApp_Startโฟลเดอร์ย่อยที่สร้างขึ้นภายในโปรเจ็กต์ของคุณที่มีNinjectMVC3.csไฟล์ ลบโฟลเดอร์นี้แล้วลองอีกครั้ง นี่คือขั้นตอนที่ฉันทำตาม:

  1. สร้างโครงการ ASP.NET MVC 3 ใหม่โดยใช้เทมเพลตเริ่มต้น
  2. เปิดหน้าต่าง Package Manager Console (ดู -> Windows อื่น -> Package Manager Console)
  3. พิมพ์install-package ninject.mvc3ในบรรทัดคำสั่ง
  4. แทนที่รหัสเริ่มต้นGlobal.asaxด้วยรหัสในคำถามของคุณ
  5. ลบAppStartโฟลเดอร์ย่อยที่สร้างขึ้นระหว่างการติดตั้งแพ็กเกจ
  6. เรียกใช้แอปพลิเคชัน
  7. เพลิดเพลินกับความสวยงามของ/Home/Indexหน้าเริ่มต้นที่เปิดในเว็บเบราว์เซอร์ Google Chrome ของคุณ :-)

3
ที่ได้ผล ฉันไม่รู้ว่าทำไม ฉันไม่ชอบแก้ไขข้อบกพร่องโดยไม่เข้าใจมัน ... แต่ขอบคุณสิ่งนี้ปลดบล็อกฉัน
Judah Gabriel Himango

19
มันไม่ได้เป็นจุดบกพร่อง แพ็คเกจ NuGet ใช้เพียงวิธีอื่นในการตั้งค่าเคอร์เนลเพื่อที่จะไม่ต้องเปลี่ยน global.asax แอปพลิเคชันของคุณใช้ทั้งสองวิธีพร้อมกันซึ่งทำให้ส่วนขยายอยู่ในสถานะที่ไม่ถูกต้องเมื่อเริ่มต้นสองครั้ง
Remo Gloor

ขอบคุณสำหรับคำอธิบายที่เป็นประโยชน์ Remo
Judah Gabriel Himango

4
อะไรคือวิธีที่ถูกต้องในการแก้ปัญหานี้โดยไม่ต้องลบโฟลเดอร์ App_Start
Ryan Lundy

12
@Kyralessa โดยออกจาก Global.asax ตามที่เป็นอยู่ (ไม่ได้มาจากNinjectHttpApplication) และกำหนดค่าเคอร์เนลใน~/App_Start/NinjectMVC3.csไฟล์ ( RegisterServicesวิธีการ)
Darin Dimitrov

120

ฉันต้องเพิ่มสิ่งนี้ด้วยความหวังว่าคนอื่นจะแก้ไขปัญหาได้เร็วขึ้นและไม่ต้องการดึงเส้นผมทุกเส้นบนศีรษะเหมือนที่ฉันทำ

ฉันต้องการเปลี่ยนชื่อทุกอย่างในโครงการเพื่อให้ตรงกับเงื่อนไขทางธุรกิจใหม่ ฉันเปลี่ยนเนมสเปซทุกที่และฉันยังเปลี่ยนชื่อแอสเซมบลี (คลิกขวาที่แท็บโปรเจ็กต์> คุณสมบัติ> แอ็พพลิเคชัน) เพื่อให้แอสเซมบลีที่สร้างขึ้นตรงกับหลักการตั้งชื่อใหม่ การเปลี่ยนชื่อชุดประกอบเป็นสิ่งที่ทำให้ Ninject โกรธมาก!

โดยการเปลี่ยนชื่อแอสเซมบลีที่สร้างไฟล์ใหม่ด้วยชื่อใหม่จะถูกสร้างขึ้นเมื่อเราคอมไพล์ อย่างไรก็ตามไฟล์เก่าที่มีชื่อเก่ายังอยู่ในไดเร็กทอรี bin! หากคุณเปิดใช้งาน Ninject ผ่านคลาสที่เพิ่มใน App_Start คลาสการเปิดใช้งานนี้จะถูกเรียกใช้ในชุดประกอบทั้งสอง (อันเก่าและเปลี่ยนชื่อใหม่) อย่าถามฉันว่าอย่างไรหรือทำไม แต่เป็นเช่นนั้นและทำให้คุณเกิดข้อผิดพลาด "เริ่มต้นแล้ว"

แม้แต่น้ำยาทำความสะอาดก็ไม่สามารถใช้งานได้เนื่องจาก Visual Studio จะลบเฉพาะไบนารีที่สร้างขึ้นเท่านั้นซึ่งจะเป็นการเปลี่ยนชื่อใหม่ มันทิ้งให้คนเก่านั่งเฉยๆ

ไปลบโฟลเดอร์ bin ของคุณก่อนที่จะลองทำอย่างอื่น! ฉันหวังว่านี่จะช่วยคนอื่นไม่ให้เสียเวลาทำงานอันมีค่าไป!


7
ฉันเสียเวลาไป 40 นาทีก่อนที่จะสะดุดกับคำตอบของคุณ ขอบคุณ Alex!
Maxim V.Pavlov

3
คำตอบที่ยอมรับไม่ได้ทำเพื่อฉัน แต่คนนี้ทำ ขอบคุณอเล็กซ์
Pluc

2
ขอบคุณมาก! ฉันใช้เวลาหนึ่งชั่วโมงในการแก้ปัญหานี้และจะต้องเผาผลาญอีกมากมายโดยที่คุณไม่ตอบสนอง นี่ควรเป็นคำตอบที่ถูกต้องสำหรับคำถามที่เหมาะสม
Doug

2
ยอดเยี่ยม! ขอบคุณอเล็กซ์ ฉันเสียเวลาไปมากในการพยายามทำสิ่งนี้วิธีแก้ปัญหาของคุณทำงานได้อย่างสมบูรณ์แบบ
Apogee

3
มันยอดเยี่ยมมาก ขอบคุณมาก. ฉันทำอย่างนี้แล้วการเปลี่ยนชื่อเนมสเปซแบบเต็มและไม่ได้ระบุปัญหาของฉันด้วยความจริงที่ว่าแอสเซมบลียังคงสร้างในถัง ขอบคุณมาก!
David L

23

ฉันได้อัปเดตเอกสาร Wiki ที่เชื่อมโยงในคำถามของคุณเพื่อแสดงทั้งสองวิธีในการตั้งค่าแอปพลิเคชัน MVC3 ฉันขอแนะนำให้ใช้ตัวเลือกที่สองซึ่งเป็นวิธีที่ต้องการสำหรับ NuGetpackage

แทนที่จะได้มาจาก NinjectHttpApplication แต่จะใช้ NinjectMVC.cs ในโฟลเดอร์ AppStart ซึ่งสร้างขึ้นระหว่างการติดตั้งแพ็คเกจ นี่คือตำแหน่งที่คุณสร้างเคอร์เนลและตำแหน่งที่คุณโหลดโมดูลของคุณหรือตำแหน่งที่คุณกำหนดการเชื่อมโยง


มีประโยชน์มาก Remo เนื่องจากฉันทำเครื่องหมายคำตอบไว้แล้วฉันจะเพิ่มคะแนนให้คุณและอาจจะโหวตให้คนอื่น ๆ อีกสองสามคน ขอบคุณสำหรับการตอบรับและอัปเดต Wiki อย่างเหนือชั้น
Judah Gabriel Himango

4

ดังที่ Alex Ford กล่าวว่า:

ฉันต้องเพิ่มสิ่งนี้ด้วยความหวังว่าคนอื่นจะแก้ไขปัญหาได้เร็วขึ้นและไม่ต้องการดึงเส้นผมทุกเส้นบนศีรษะเหมือนที่ฉันทำ

ฉันมีปัญหารุ่นพิเศษซึ่งสามารถแก้ไขได้ดังนี้:

รายละเอียดข้อยกเว้น: System.InvalidOperationException: ลำดับไม่มีองค์ประกอบ

ข้อผิดพลาดนี้เกิดจากการที่มี 2 โปรเจ็กต์ที่มี App_Start / NinjectWebCommon.cs

การลบไฟล์ช่วยขจัดข้อผิดพลาด

หมายเหตุ: หากคุณกำลังรับ Ninject.Web.Common เนื่องจากคุณต้องการอ้างอิง NinjectWeb.Common แอสเซมบลีสำหรับโปรเจ็กต์ไลบรารีคลาสของคุณคุณสามารถลบโฟลเดอร์“ App_Start” และ“ NinjectWebCommon.cs” ได้อย่างปลอดภัย มีไว้สำหรับโครงการเว็บ / เว็บ API

> คลิกที่นี่เพื่อดูรายการบล็อกเดิม <


หลังจากเปลี่ยนเนมสเปซของโปรเจ็กต์ของฉันวันนี้ฉันก็พบปัญหาเดิมอีกครั้ง วิธีแก้ปัญหาทั้งหมดที่นี่ไม่ได้ช่วยอะไร การทำความสะอาดและการสร้างใหม่ไม่ได้ช่วยอะไร แต่สิ่งที่ช่วยได้คือการลบโฟลเดอร์ bin และ obj ของโครงการของฉัน ดูเหมือนว่ายังมีบางส่วนของเนมสเปซเก่าติดอยู่ซึ่งไม่ได้ถูกลบด้วยการทำความสะอาด
Wowe

สวัสดี Da_Wolf นั่นแหล่ะ ขอขอบคุณ. คุณแก้ปัญหาของฉัน
VivekDev

2

วิธีแก้ปัญหาของฉันคือฉันได้ตั้งค่าคุณสมบัติโฟลเดอร์ App_Start, Namespace Provider เป็น True

ฉันเปลี่ยนสิ่งนี้เป็น False เพื่อให้ Resharper ไม่เน้นว่าเนมสเปซไม่ตรงกับโครงสร้างโฟลเดอร์


นี่คือสำหรับฉันทำให้ฉันเป็นบ้า
rashleighp

2

ต้องการเพิ่มอีกหนึ่งสาเหตุ ...

เราได้ติดตั้งแพ็คเกจ Ninject.MVC3 ให้กับหลาย ๆ โปรเจ็กต์ - เพียงหนึ่งในนั้นคือแอปพลิเคชัน MVC ที่แท้จริง อย่างไรก็ตามเราลืมลบโฟลเดอร์ App_Start

การลบโฟลเดอร์ App_Start ออกจากโปรเจ็กต์ที่อ้างถึงช่วยแก้ปัญหาได้


ใช่ นี่มัน! ฉันเพิ่มไฟล์ Ninjectwebcommon.cs ที่สองโดยไม่ได้ตั้งใจใน porject อื่น! นี่คือมัน (ใช้ MVC 5)
Jose A

1

เพื่อตอบสนองต่อคำตอบของ @ Chev ... นี่เป็นปัญหาสูงสุดของฉันเช่นกัน หากคุณกำลังปรับใช้กับเว็บไซต์ Azure (ปัจจุบันใช้ชื่อว่า AppSite) คุณต้องการคลิกที่ช่องนี้ในการเผยแพร่เพื่อลบไฟล์เก่า

เผยแพร่ไปยังภาพหน้าจอสีฟ้า


นี่คือภาพเดียวกับที่ฉันกำลังจะโพสต์! ฉันหวังว่าฉันจะเลื่อนลงไปที่คำตอบนี้ แต่คำตอบข้างต้นนำฉันไปสู่แนวคิดนี้ +1
Jess
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.