2010-02-11 5 views
6

내가 사용하고 있습니다 : -어떻게 asp.net mvc 2와 함께 ninject 2.0을 사용할 수 있습니까?

  1. 의 asp.net MVC의 RC 2
  2. Ninject에와 Ninject에 asp.net MVC 확장 (http://github.com/enkari/ninject.web.mvc)

나는이에 대해 정의 된 '어떤 매개 변수가없는 생성자를 받고 없습니다 유지 목적.' 내 AccountController에 대한. AccountController는 Services로 주입된다. 이러한 서비스의 바인딩은 ServiceModule에 정의됩니다.

Global.asax.cs에서 내 MvcApplication 코드를 찾으십시오.

public class MvcApplication : NinjectHttpApplication // System.Web.HttpApplication 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Account", action = "Login", id = "" } // Parameter defaults 
     ); 

    } 

    protected override void OnApplicationStarted() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterRoutes(RouteTable.Routes); 

     RegisterAllControllersIn(Assembly.GetExecutingAssembly()); 
    } 

    protected override IKernel CreateKernel() 
    { 
     return new StandardKernel(new INinjectModule[] { 
      new ServiceModule(), 
     }); 
    } 
} 
+0

작동 다른 컨트롤러 있습니까? ASP.NET MVC 2 RC 2에 대한 Ninject.Web.Mvc 프로젝트를 만들었습니까? – Charlino

+0

@Charlino. 고마워. –

답변

7

ASP.Net MVC 2 dll에 대해 Ninject.Web.Mvc를 재구성하면 문제가 해결됩니다. 문제는 NinjectControllerFactory 클래스에 있습니다. 컨트롤러 인스턴스를 얻을 수있는 방법의 서명이 필요한 변경을 확인하고 Ninject에 MVC 확장을 다시

IController GetControllerInstance(
     RequestContext requestContext, Type controllerType) 

에 MVC 2

IController GetControllerInstance(Type controllerType) 

의 변경이 모두 잘 작동합니다. 제안을 위해 @Charlino에게 감사드립니다.

+1

반가워요. Gutted 나는 대답을하지 않았고 점수를 얻지 못했습니다! ;-) – Charlino

-1

Ninject에서 Application_Start 메소드를 재정의하지 않아도됩니다. 자동으로 실행되지 않는 작업이 필요한 경우 (Ninject가 해당 작업을 수행하면 머리 부분을 잘 모름)을 호출하여 모든 Ninject 관련 항목을 실행하게하십시오. 정확히.

protected override void OnApplicationStarted() 
{ 
    base.OnApplicationStarted(); 

    // Kick some butt here 
} 
+0

'NinjectHttpApplication.cs'파일에서 볼 수 있듯이이 함수는 비어 있습니다. 나는 그것이 당신이 (가상이기 때문에) 말한 방식으로해야한다는 데 동의하지만 그건 내 문제를 해결하지 못한다. –

-1

코드는 'new ServiceModule()'다음의 쉼표를 제외하고 올바르게 보입니다.

Global.asax.cs가 아니고 Global.aspx.cs에 있어야합니다.

+0

질문에서 파일 이름을 편집했습니다. 그것은 타이핑 실수였습니다. 쉼표는 중요하지 않습니다. 구문을 입력하고 있습니다. –

1

무엇 때문에, global.asax.cs가 NinjectHttpApplication에서 상속하면 OnApplicationStarted()가 호출되지 않는다는 것을 발견했습니다. Init()을 재정의하기 위해 OnApplicationStarted()를 변경하면 제대로 작동합니다.

은 아래를 참조하십시오 :

public class MvcApplication : NinjectHttpApplication // System.Web.HttpApplication 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Account", action = "Login", id = "" } // Parameter defaults 
     ); 

    } 

    public override void Init() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterRoutes(RouteTable.Routes); 

     RegisterAllControllersIn(Assembly.GetExecutingAssembly()); 
    } 

    protected override IKernel CreateKernel() 
    { 
     return new StandardKernel(new INinjectModule[] { 
      new ServiceModule(), 
     }); 
    } 
} 
관련 문제