[asp.net-mvc-3] Ninject + MVC3 = InvalidOperationException : 시퀀스에 요소가 없습니다.

새 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 ()을 호출하여 예외를 던집니다.

내가 뭘 잘못하고 있죠?



답변

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


답변

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

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

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

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

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


답변

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

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


답변

Alex Ford가 말했듯이 :

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

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

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

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

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

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

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


답변

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

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


답변

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

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

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


답변

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

하늘빛 스크린 샷에 게시