2015-01-09 6 views
1

MVC 5와 최신 Ninject.MVC5 Nuget 패키지를 사용하여 새로운 프로젝트를 설정하려고합니다. 그러나 "이 개체에 대해 정의 된 매개 변수가없는 생성자"예외가 나타납니다.ASP.NET MVC5에서 Ninject를 사용하는 방법

저는 주위를 둘러 보았고 자신의 DependencyResolver를 만들어야한다고 말하는 Ninject MVC 5 Nuget 패키지 이전의 많은 답변을 발견했습니다. 나는 또한 내가 현재 관심이없는 WebApi2에 대한 많은 답변을 발견했다.

이 답변 - MVC5, Web API 2 and Ninject - 내 질문에 직접적으로 대답하지 않는 동안 모든 것이 최신 Nuget 패키지와 함께 작동하고 생성 된 코드를 살펴보아야 함 NinjectWebCommon.cs에서는 "그냥 작동"하는 것처럼 보입니다.

현재 코드를 사용하면 NinjectWebCommon.cs에 중단 점을 넣을 수 있으며 내 구성을 실행하므로 Ninject가 MVC에 올바르게 등록되지 않은 것일 수 있습니다.

내 주된 질문은 MVC 5 용 최신 누젠트 패키지가 더 이상 클래스 나 코드없이 작동해야한다는 것입니다.

종속성 해결 프로그램 클래스에 대해 NinjectWebCommon.cs에서 만든 커널을 어떻게 가져야합니까?

재미있는 일이 생기면 다음은 내 App_Start \ NinjectWebCommon.cs입니다. 변경된 유일한 줄은 NinjectModule 인 MyProject.NinjectConfiguration을 등록하는 것입니다. 어떤 이유 때문에

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(MyProject.App_Start.NinjectWebCommon), "Start")] 
[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute(typeof(MyProject.App_Start.NinjectWebCommon), "Stop")] 

namespace MyProject.App_Start 
{ 
    using System; 
    using System.Web; 

    using Microsoft.Web.Infrastructure.DynamicModuleHelper; 

    using Ninject; 
    using Ninject.Web.Common; 

    public static class NinjectWebCommon 
    { 
     private static readonly Bootstrapper bootstrapper = new Bootstrapper(); 

     /// <summary> 
     /// Starts the application 
     /// </summary> 
     public static void Start() 
     { 
      DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); 
      DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); 
      bootstrapper.Initialize(CreateKernel); 
     } 

     /// <summary> 
     /// Stops the application. 
     /// </summary> 
     public static void Stop() 
     { 
      bootstrapper.ShutDown(); 
     } 

     /// <summary> 
     /// Creates the kernel that will manage your application. 
     /// </summary> 
     /// <returns>The created kernel.</returns> 
     private static IKernel CreateKernel() 
     { 
      var kernel = new StandardKernel(); 
      try 
      { 
       kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
       kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

       RegisterServices(kernel); 
       return kernel; 
      } 
      catch 
      { 
       kernel.Dispose(); 
       throw; 
      } 
     } 

     /// <summary> 
     /// Load your modules or register your services here! 
     /// </summary> 
     /// <param name="kernel">The kernel.</param> 
     private static void RegisterServices(IKernel kernel) 
     { 
      kernel.Load(new MyProject.NinjectConfiguration()); 
     }   
    } 
} 
+0

'컨트롤러의 생성자'는 어떻게 생겼습니까? 또한 다음과 같이 인스턴스를 바인드해야한다 :'커널 .Bind () .ToSelf() .InRequestScope(); 또는'kernel.Bind (). To ();'inside 'RegisterServices (IKernel kernel)'메쏘드 – Catalin

+0

@RaraituL 고마워요, 내가 완전히 바보가 된 곳을 지적 해주었습니다! – Dan

답변

1

좋아, 난 완전히 내 컨트롤러 액션 메소드가 생성자 아니라고보고 실패!

그래서이 질문에 대한 대답은 새로운 Ninject.MVC5 Nuget 패키지가 작동한다는 것입니다. 문제가 생기면 먼저 어리석은 짓을하지 않는지 확인하십시오.