2010-12-01 5 views
1

내 MVC 응용 프로그램에 DI를 도입하고 있으며 사용자 정의 컨트롤러 팩토리에서 컨트롤러를 인스턴스화하는 데 문제가 있습니다. 재정의 된 "GetControllerInstance"가 호출되지 않는 것 같습니다.MVC - 성 Windsor 컨트롤러 팩터 리 생성 -이 객체에 대해 정의 된 매개 변수없는 생성자 없음

누군가 내가 누락 된 내용을 말해 줄 수 있습니까?

내 컨트롤러 공장 :

public class WindsorControllerFactory : DefaultControllerFactory 
{ 
    public WindsorControllerFactory() 
    { 
     var controllerTypes = from t in AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes()) 
           where typeof (IController).IsAssignableFrom(t) 
           select t; 
     foreach (Type controllerType in controllerTypes) 
     { 
      ApplicationContainer.Container.AddComponentLifeStyle(controllerType.FullName, controllerType, 
                   LifestyleType.Transient); 
     } 
    } 

    protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType) 
    { 
     if(controllerType !=null) 
     { 
      return (IController) ApplicationContainer.Container.Resolve(controllerType); 
     } 
     return base.GetControllerInstance(requestContext, controllerType); 
    } 
} 

}

위해 Application_Start :

ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory()); 
    } 

이 컨트롤러 공장 인스턴스화하고 있지만이 컨트롤러를 해결하는 데 사용되지 않는 것으로 보인다. 나는 'GetControllerInstance'에 중단 점을 배치했으나 결코 부딪치지 않습니다.

결과는이 개체에 대해 정의 된 매개 변수없는 생성자입니다. 예외는

을 던져

갱신 :

나는이에 GetControllerInstance을 변경 :

private WindsorContainer _container; 

    public WindsorControllerFactory(WindsorContainer container) 
    { 
     _container = container; 
     _container.Register(AllTypes.Of<IController>().FromAssembly(
     typeof(BaseFactoryController).Assembly).Configure(
      c => c.Named(c.Implementation.Name.ToLowerInvariant()).LifeStyle.Transient)); 
    } 

지금 내가 널 controllerType를 무시해야한다?! 댓글을 달지 않은 경우 :

//base.GetControllerInstance(requestContext, controllerType);

내 .js 파일을 컨트롤러로 처리하기 시작합니다.

protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType) 
    { 
     if (controllerType == null) 
     { 
      return null; 
     } 
     //base.GetControllerInstance(requestContext, controllerType); 
     return (IController) _container.Resolve(controllerType); 
    } 
+0

js를 컨트롤러로 취급하는 것에 대해, 같은 질문, http://stackoverflow.com/questions/1598421/why-is-castle-windsor-trying-to-resolve-my-content-and-scripts-folder와 동일한 권장 사항 -as-a-co –

답변

1

creating WindsorContainer results in type conversion error 참조 httpException 어느 발생 (꽤 같은 질문을하지만, 그럼에도 불구하고 같은 대답) 당신이 할 수 있습니다 다른 문제가

+0

가능하다면 다른 라이브러리를 소개하지 않겠습니다. 나는이 구현이 왜 작동하지 않는지를 선호한다. – Nick

+0

@ 닉 : 참조로 MVCContrib의 구현을 사용하여 비교할 수 있습니다. –

+0

@Maurcio : 당신이 이겼어 : 나는 MVCContib을보고있다. MVCContrib.Castle 네임 스페이스는 어디에 있습니까? 그것은 MVCContrib.dll에있는 것으로 보이지 않습니다. – Nick

0

이 호출이 :

AppDomain.CurrentDomain.GetAssemblies() 

.. 어셈블리가 실제로 AppDomain에로드되지 않은 경우 사용 가능한 모든 컨트롤러를 검색하지 마십시오. AppDomain은 필요할 때 어셈블리를로드하므로 코드에서 명시 적으로 호출하지 않으면로드되지 않습니다.

+0

내 게시물을 새롭게 구현하여 업데이트 중입니다. – Nick

관련 문제