0

왜 기본 팩토리가 이 아니겠습니까?은 네임 스페이스가있는 컨트롤러의 전체 이름을 반환하지 않습니까? Service Locator 및 Autofac을 사용하고 있습니다. 영역이있는 MVC 2 Beta DefaultControllerFactory

using System.Web.Mvc; 

using Microsoft.Practices.ServiceLocation; 

namespace Application.Core.MVC 
{ 

     public override IController CreateController(System.Web.Routing.RequestContext requestContext, string **controllerName**) 
     { 
      return ServiceLocator.Current.GetInstance<IController>(controllerName); 
     } 
} 

나는 모두 위의 코드에 완전 수식 명없이 전용 "홈"을 반환 컨트롤러 명이 홈 컨트롤러 (지역 블로그 미만)

http://localhost/Home

http://localhost/Blog/Home

했다. 종속성 주입에 대한 regiser 컨트롤러의 이름을 시도 할 때 문제가 발생합니다. 다음은이 상황에 따라 컨트롤러를 지금 등록하는 방법입니다. 이 경우에도 예외없이 페이지가 표시됩니다. 그러나 http://localhost/Home에 액세스하면 두 컨트롤러가 모두 호출됩니다.

foreach (var tp in currentAssemblyControllersTypes) 
        builder.Register(tp).FactoryScoped().Named(tp.Name.Replace("Controller", "")); 

누구든지 도움을받을 수 있습니까?

답변

2

DefaultControllerFactory.CreateController() 메소드는 주어진 요청에 대해 컨트롤러를 리턴합니다. controllerName 매개 변수는 경로의 {controller} 부분입니다. 그것은 입니다. CreateController()의 작업 - 호출자가 아닌 - URL에 지정된대로 컨트롤러 이름이 지정된 적절한 유형을 알아내는 것입니다.

DefaultControllerFactory.CreateController()는 GetControllerType()과 GetControllerInstance()의 두 가지 다른 메서드를 위임합니다. 원래 컨트롤러 분석 로직 (예 : 유형 조회)을 사용하고 유형이 인스턴스화되는 방식 만 변경하려면 CreateController() 및 GetControllerType() 메소드를있는 그대로두고 GetControllerInstance()를 재정의하십시오. 이미 복제중인 네임 스페이스 조회 논리를 처리하므로 코드가 훨씬 간단 해집니다.

+0

감사합니다. 그냥 GetControllerInstance() 사용해야합니다. – stoto

0

[업데이트 레위의 대답에 따라]

1.Register 명시 적으로 이름에있는 각 컨트롤러 :

foreach (var tp in currentAssemblyControllersTypes) 
       builder.Register(tp).FactoryScoped().Named(tp.FullName) 

//Application.Controllers.HomeController 
//Application.Areas.Blog.Controllers.HomeController 

Global.ascx에서 Application.Controllers.HomeController에 대한지도 노선() 2 .Specify 네임 스페이스 .cs PDC09 데모

routes.MapRoute(
        "Default",            // Route name 
        "{controller}/{action}/{id}",       // URL with parameters 
        new { controller = "Home", action = "Index", id = "" } // Parameter defaults 

        ,new string [] { "Application.Controllers"} //Specify namespace 

    ); 

     } 

3.Override GetControllerInstance() meothod IoCControllerFactory.cs

Protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, System.Type controllerType) 
{ 
    return (controllerType == null)? base.GetControllerInstance(requestContext,controllerType):ServiceLocator.Current.GetInstance<IController>(controllerType.FullName); 
}