2009-04-05 5 views
27

최근에 StructureMap을 사용하여 종속성 주입을 구현하려고했습니다. 예제를 계속 따라갈 수 있었지만 응용 프로그램을 실행할 때마다 예외가 발생했습니다. 컨트롤러 팩토리에서 가져온 일부 코드입니다.ASP.NET MVC의 사용자 지정 컨트롤러 팩토리, Dependency Injection/Structuremap 문제

public class StructureMapControllerFactory : DefaultControllerFactory 
{ 
    protected override IController GetControllerInstance(Type controllerType) 
    { 
     if (controllerType == null) 
      throw new ArgumentNullException("controllerType"); 

     return ObjectFactory.GetInstance(controllerType) as Controller; 
    } 
} 

내 Global.asax에 내 모든 종속성을 등록하는 정적 부트 스트 래퍼 클래스를 호출하지만 StructureMapControllerFactory의 GetControllerInstance가 두 번 호출지고 것 같습니다. 처음 호출되면 적절한 controllerType이 전달되지만 두 번째 호출에서는 항상 null입니다.

처음으로 GetControllerInstance가 호출되면 형식이 올바른 HomeController로 설정됩니다. HomeController에서 발생하는 코드는 View()를 반환합니다. View()가 반환되면 aspx 파일에서 Page_Load 이벤트가 호출됩니다. 단계별로 진행되면 다음 행에 도착합니다.

httpHandler.ProcessRequest (HttpContext.Current);

두 번째로 GetControllerInstance가 호출됩니다.

protected void Application_Start() 
    { 
     RegisterRoutes(RouteTable.Routes); 

     Bootstrapper.ConfigureStructureMap(); 

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

나는 의존성 주입 작업을 얻을 촉각을 곤두 세우고있어 누군가가 나를 도울 수 있다면 가장 감사 할 것입니다 :

여기에 관련이있을 수 내 Global.asax에 비트입니다. :)

+1

안녕하세요, 동일한 문제가 발생했습니다. – Micah

+0

컨트롤러를 어떻게 등록합니까? – Sebastian

+0

좋은 문제 설명. –

답변

45

UPDATE 이 일어나고있는 이유는 이미지가 CSS 파일에 지정되어, 그 이미지가 없을 때 라우팅 프레임 워크는 컨트롤러에 URL을 매핑을 시도하는 것입니다. 아래에 나열된 경로를 무시하면 오류가 발생하지 않습니다. 그러나 누락 된 리소스가 있다는 알림을받을 수있는 좋은 방법이기 때문에 구현하지 않기로했습니다.

구조도 here을 사용하여 종속성 주입 설정의 예와 함께 자세한 설명을 볼 수 있습니다.

나는 똑같은 문제를 겪고 있었고, 나는 그것을 알아 냈다고 생각한다. 컨트롤러 팩토리를 제공하려고 할 때마다 어떤 이유로 든 추가 IgnoreRoute 정의를 추가해야합니다.

if(controllerType == null) 
    return base.GetControllerInstance(controllerType) 

이 적어도 당신이이 controllerType가 null로 원인을 요청되는 등의 오류 메시지에서 더 많은 정보를 제공합니다 : 내가 할 것이 첫 번째 것은 당신의 GetControllerInstance 방법이 줄을 추가합니다. 내 특정 경우에는 내가 이렇게 설정 내 CSS 파일에서 배경 이미지를했다 :

background: url(img/logo.gif); 

그래서 무슨 일 라우팅는 "IMG"라는 컨트롤러와 logo.gif 또는 무언가를 함께 취하는 행동을 찾고있다 그 라인들. 그것은 분명히 올바른 행동이 아닙니다.

일부 파고 들자 마자 IgnoreRoute 정의를 내 글로벌에 추가해야한다는 것을 알았습니다.이 같은 내 사이트의 "콘텐츠"디렉토리에 아무것도 무시합니다 asax 파일 : 기본 ControllerFactory으로이 작업을 수행 할 필요가 없습니다 왜

routes.IgnoreRoute("{Content}/{*pathInfo}"); 

나는 아직 잘 모르겠지만, 그럼에도 불구하고 그것은 작동합니다.

favicon.ico에서 같은 문제가 발생할 수 있습니다. 특히 구글 크롬을 사용하는 경우. 다음과 같이 추가해야합니다.

routes.IgnoreRoute("{*favicon}", new {[email protected]"(.*/)?favicon.ico(/.*)?"}) 
+0

을 던져야한다고 생각합니다. 이것은 아마도 이유는 집에있을 때 다시보고 할 것입니다. – kitsune

+1

Windsor ControllerFactory에서 같은 문제가있었습니다. 수정 주셔서 감사합니다, 그것은 잘 작동합니다. 배경에 대한 –

+0

+1 : url (img/logo.gif); 내 실수는 JQuery UI를 사용하고 이미지 파일을 포함하지 않았기 때문입니다. 나는 기능의 작은 조각을 사용하고 있었고 필요한 이미지를 실현하지 못했습니다. – ozz

4

프로젝트에 추가되지 않은 정적 파일 (예 : javascript 파일)을 요청하고 있거나 해당 파일에 대한 참조에 오타가있을 수 있습니다. 브라우저의 웹 요청을 모니터하고 웹 요청이 정적 파일로 올바르게 해석되지 않을 때 찾아야합니다. IE를 사용하는 경우 FF 또는 피 들러에서 방화 광을 사용할 수 있습니다.

관련 문제