Ninject + MVC3 = InvalidOperationException : 시퀀스에 요소가 없습니다.


90

새 MVC3 프로젝트를 만들고 F5를 누르고 샘플 페이지를 보았습니다.

그런 다음 NuGet을 사용하여 Ninject.MVC 확장 을 얻었습니다 . Ninject 문서, How To Setup an MVC3 Application 에 따라 global.asax를 수정했습니다 .

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/IndexGoogle 크롬 웹 브라우저에서 열리는 기본 페이지 의 아름다움을 즐기십시오 :-)

3
작동했습니다. 이유를 모르겠습니다. 나는 그것을 이해하지 않고 버그를 고치는 것을 좋아하지 않는다 ...하지만 감사합니다.
유다 가브리엘 희망 고

19
버그가 아닙니다. NuGet 패키지는 커널을 설정하는 다른 방법 만 사용하므로 global.asax를 변경할 필요가 없습니다. 응용 프로그램은 두 가지 방법을 동시에 사용하여 확장이 두 번 시작될 때 잘못된 상태가되었습니다.
Remo Gloor 2011 년

도움이되는 설명에 감사드립니다, 레모.
유다 가브리엘 히 망고 2011 년

4
App_Start 폴더 삭제 하지 않고이 문제를 해결하는 올바른 방법은 무엇입니까 ?
Ryan Lundy 2011 년

12
@Kyralessa, Global.asax를 그대로두고 (에서 파생되지 않음 NinjectHttpApplication) ~/App_Start/NinjectMVC3.cs파일 에서 커널을 구성 합니다 ( RegisterServicesmethod).
Darin Dimitrov 2011 년

120

나는 다른 누군가가 문제를 더 빨리 해결하고 내가 거의했던 것처럼 머리에있는 모든 머리카락을 뽑고 싶지 않기를 바라면서 이것을 추가해야한다.

새로운 비즈니스 용어와 일치하도록 프로젝트의 모든 이름을 변경해야했습니다. 모든 곳에서 네임 스페이스를 변경했으며 생성 된 어셈블리가 새 명명 규칙과 일치하도록 어셈블리 이름 (프로젝트 마우스 오른쪽 단추 클릭> 속성> 애플리케이션 탭)도 변경했습니다. 어셈블리 이름 변경은 Ninject를 매우 화나게 만든 것입니다!

생성 된 어셈블리의 이름을 바꾸면 컴파일 할 때 새 이름을 가진 새 파일이 생성되었습니다. 그러나 이전 이름의 이전 파일은 여전히 ​​bin 디렉토리에있었습니다! Ninject가 App_Start에 추가 된 클래스를 통해 활성화 된 경우이 활성화 클래스는 두 어셈블리 (이전 어셈블리와 새 이름이 바뀐 어셈블리)에서 호출됩니다. 방법이나 이유를 묻지 마십시오.하지만 "이미 초기화 된"오류가 발생합니다.

Visual Studio는 새로 이름이 변경된 바이너리 만 생성하는 바이너리 만 제거하므로 청소 솔루션도 작동하지 않습니다. 그것은 단지 거기에 앉아있는 오래된 것들만 남겨 둡니다.

다른 작업을 시도하기 전에 bin 폴더를 삭제하십시오! 이로 인해 다른 사람이 귀중한 근무 시간을 낭비하지 않기를 바랍니다!


7
글쎄, 나는 당신의 대답을 우연히 발견하기 전에 40 분 정도 낭비했습니다. 감사합니다 Alex!
Maxim V. Pavlov 2012

3
받아 들여진 대답은 나를 위해하지 않았지만 이것은했습니다. 고마워 Alex.
Pluc

2
정말 고맙습니다! 이 문제에 대해 한 시간을 태 웠고 귀하의 응답 없이는 더 많이 태 웠을 것입니다. 이것은 적절한 질문에 대한 정답이어야합니다.
Doug

2
훌륭한! 고마워 Alex. 이 문제를 해결하기 위해 너무 많은 시간을 낭비했고 귀하의 솔루션이 완벽하게 작동했습니다.
Apogee 2014

3
환상적이었습니다. 정말 고맙습니다. 나는 정확히 이것을했고, 전체 네임 스페이스 이름을 바꾸었고 어셈블리가 여전히 빈에 빌드되었다는 사실에 내 문제를 제기하지 않았습니다. 대단히 감사합니다!
David L

23

MVC3 응용 프로그램을 설정하는 두 가지 방법을 모두 보여주기 위해 귀하의 질문에 링크 된 문서 Wiki를 업데이트했습니다. NuGetpackage에 대해 선호되는 두 번째 옵션을 사용하는 것이 좋습니다.

NinjectHttpApplication에서 파생되는 대신 패키지 설치 중에 생성되는 AppStart 폴더의 NinjectMVC.cs를 사용합니다. 이는 커널을 생성하고 모듈을로드하거나 바인딩을 정의하는 위치이기도합니다.


매우 도움이되었습니다, 레모. 이미 답변을 표시 했으므로 귀하의 답변을 찬성하고 다른 답변을 찬성 할 것입니다. Wiki에 대한 답변과 업데이트에 대해 그 이상을 수행해 주셔서 감사합니다.
Judah Gabriel Himango 2011 년

4

Alex Ford가 말했듯이 :

나는 다른 누군가가 문제를 더 빨리 해결하고 내가 거의했던 것처럼 머리에있는 모든 머리카락을 뽑고 싶지 않기를 바라면서 이것을 추가해야한다.

다음과 같이 해결할 수있는 특수 버전의 문제가 있습니다.

예외 정보 : System.InvalidOperationException : 시퀀스에 요소가 없습니다.

이 오류는 App_Start / NinjectWebCommon.cs에 2 개의 프로젝트가 있기 때문에 발생합니다.

파일을 제거하면 오류가 제거됩니다.

참고 : 클래스 라이브러리 프로젝트 중 하나에 대해 Ninject.Web.Common 어셈블리를 참조해야하므로 Ninject.Web.Common을 새로 가져 오는 경우 "App_Start"폴더와 "NinjectWebCommon.cs"를 안전하게 제거 할 수 있습니다. 웹 / 웹 API 프로젝트를위한 것입니다.

> 원래 블로그 항목을 보려면 여기를 클릭하십시오 <


내 프로젝트의 네임 스페이스를 변경 한 후 오늘도 같은 문제가 발생했습니다. 여기에있는 모든 솔루션이 도움이되지 않았습니다. 청소 및 재건은 도움이되지 않았습니다. 그러나 도움이 된 것은 내 프로젝트의 bin 및 obj 폴더를 삭제하는 것입니다. 정리로 삭제되지 않은 이전 네임 스페이스 부분의 일부가 여전히 붙어있는 것 같습니다.
Wowe

안녕 Da_Wolf, 그게 다야. 감사합니다. 당신은 내 문제 해결
VivekDev

2

내 솔루션은 App_Start 폴더 속성 인 Namespace Provider를 True로 설정 한 것입니다.

Resharper가 폴더 구조와 일치하지 않는 네임 스페이스를 강조하지 않도록 이것을 False로 변경했습니다.


이것은 나를 미치게 만들었습니다.
rashleighp

2

원인을 하나 더 추가하고 싶었습니다 ...

Ninject.MVC3 패키지를 여러 프로젝트에 설치했습니다. 그 중 하나만 실제 MVC 응용 프로그램이었습니다. 그러나 App_Start 폴더를 제거하는 것을 잊었습니다.

참조 된 프로젝트에서 App_Start 폴더를 제거하면 문제가 해결되었습니다.


네! 이거 다! 실수로 다른 폴더에 두 번째 Ninjectwebcommon.cs 파일을 추가했습니다! 이것이 (MVC 5 사용)
Jose A

1

@Chev의 대답을 계속하기 위해 ... 이것은 내 궁극적 인 문제였습니다. Azure 웹 사이트 (현재 AppSite)에 배포하는 경우 게시에서이 상자를 클릭하여 이전 파일을 제거하려고합니다.

하늘빛 스크린 샷에 게시


이것은 내가 게시하려는 똑같은 사진입니다! 이 답변으로 스크롤했으면 좋겠지 만 위의 답변은이 아이디어로 이어집니다. +1
Jess
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.