2011-03-29 5 views
0

간단한 부트 스트 래퍼를 만들려고합니다.Ninject 및 DependencyResolver를 사용하여 ASP.NET MVC 3에서 부트 스트 래퍼 만들기

public class RegisterRoutes : IBootstrapperTask 
{ 
    private readonly RouteCollection routes; 

    public RegisterRoutes(RouteCollection routes) 
    { 
     this.routes = routes; 
    } 

    public RegisterRoutes() : this(RouteTable.Routes) 
    { 
    } 

    public void Execute() 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }); 
    } 
} 

내 Global.asax에 외모 : 부트 스트 래퍼를 통해 경로를 등록하는 것이었다에

public interface IBootstrapperTask 
{ 
    void Execute(); 
} 

내 첫 번째 시도 :

public static void Run() 
{ 
    var tasks = DependencyResolver.Current.GetServices<IBootstrapperTask>(); 

    foreach (var task in tasks) 
    { 
     task.Execute(); 
    } 
} 

IBootstrapperTask 인터페이스처럼 보이는 :처럼 내 boostrapper 코드가 보인다 like :

protected void Application_Start() 
{ 
    DependencyResolver.SetResolver(new NinjectDependencyResolver()); 
    AreaRegistration.RegisterAllAreas(); 

    RegisterGlobalFilters(GlobalFilters.Filters); 
    Bootstrapper.Run(); 
} 

그리고 내 NinjectDependencyResolver은 다음과 같습니다 VirtualPathProvider 일치하는 바인딩을 사용할 수 없으며, 유형이 활성화

오류 : 나는 다음과 같은 예외가이 코드를 실행하려고 할 때, 그러나

kernel.Bind<IBootstrapperTask>().To<RegisterRoutes>(); 

자기 구속력이 없다.

활성화 경로 :

3) 형 RouteCollection의 생성자 파라미터 virtualPathProvider에 종속 VirtualPathProvider 사출

2) 형 RegisterRoutes

1) 요청의 생성자의 매개 경로에 종속 RouteCollection 사출 IBootstrapperTask에 대한

어떤 도움을 주시면 대단히 감사하겠습니다.

편집

일에 내 예를 들어 필요했다 그 누락 된 바인딩 :이 이미이 바인딩을 가지고 있기 때문에 당신이 Ninject에 MVC 확장을 사용하는 경우 필요하지 않습니다 바인딩

kernel.Bind<RouteCollection>().ToConstant(RouteTable.Routes); 

그리고 아래의 답변에 따라 상자 밖의 몇 가지.

답변

1

Ninject.Extensions.MVC의 사용법은 https://github.com/ninject/ninject.web.mvc/wiki/Setting-up-an-MVC3-application을 참조하십시오. 필요한 바인딩을 추가합니다.

+0

Remo, 내 문제를 해결할 수있는 확장 기능을 사용하는 이유를 설명해 주시겠습니까? 특정 바인딩이 이미 저에게 설정 되었기 때문입니까 (이 경우 VirtualPathProvider와 같은)? 더 중요한 것은, 만약 내가 확장 기능을 사용하지 않기로 결정한다면, 어떤 종류의 바인딩이 내 문제를 해결할 수 있을까? 도와 주셔서 감사합니다. – Thomas

+1

nesessary 바인딩을 추가합니다. 자신의 구현을 수정하기 위해 추가해야 할 부분을 분석하지 않아서 죄송합니다. 모든 사용자 지정 구현을 지원할 시간이 필요하지 않습니다. 구현을 지원하는 데는 이미 많은 시간이 걸립니다. 그리고 나는 관습과 관련된 점을 보지 못합니다. –

0

정확하게 Ninject에 대해 확실하지 않지만 다른 컨테이너에서 같은 문제가 발생했습니다.

컨테이너는 기본적으로 매개 변수를 사용하여 생성자를 가져오고 자동 배선을 사용하려고하지만 RouteCollection 대신 삽입 할 부분을 알지 못합니다.

나도하려고합니다 : (당신이 필요로하는 정확한 생성자를 사용하는

  • 조정할 컨테이너 등록 예를 들어 람다를 사용하여, 나는 아마 (Ninject에이 kernel.Bind<IBootstrapperTask>().To(() => new RegisterRoutes()); 또는
  • 처럼 등록을 허용해야 확실 해요 더 나은 방법) RouteCollection으로 등록하십시오. ID est - kernel.Bind<RouteCollection>().To(RouteTable.Routes). 업데이트 : Remo는 Ninject 용 MVC Extensions가 이미 나와 있으며, 등록은 이미 제공되어 있습니다 (그리고 필요한 대부분의 다른 것들). 그래서, 확실히이 길로 가라. 편의를 위해 이러한 확장을 사용하는 것이 좋습니다.
+0

Ninject.Extensions.MVC에는 기본적으로 Bind (). ToConstant (RouteTable.Routes)가 이미 있습니다. 다른 하나를 추가하면 예외가 발생합니다 ( –

+0

).하지만 주제에 대한 확장 기능에 대해서는 아무 것도 없습니다. (나는 그들에 대해서도 잘 모르고 있었고, 저는 대부분 StructureMap 사용자였습니다). 그리고이 주제에서 언급 된 예외는 IoC 컨테이너가 주어진 BootstrapperTask에 대해 RouteCollection을 해결하려고 시도 할 때 ** 예외 ** 예외입니다. 그것은 RouteCollection 클래스의 인스턴스를 생성하려고 시도하지만 생성자에 대한 VirtualPathProvider를 찾지 못합니다 (즉,'RouteTable.Routes'가 디폴트'RouteCollection'으로 등록되지 않았습니다). 화제 시동기 같이 그런 연장을 사용하지 않는다는 것을 본다. 나는 내 대답을 조금씩 명확하게 진술 할 것이다. –

관련 문제