2010-07-20 2 views
1

내 MVC 컨트롤러를 MVC 프로젝트의 다른 프로젝트에 배치 할 방법을 찾아야합니다.별도의 어셈블리와 Castle Windsor의 ASP.NET MVC 컨트롤러

나는 가깝다고 생각합니다. Castle Windsor IoC 컨테이너를 설치하고 내 컨트롤러를 다른 프로젝트에 설치했습니다. 나는 그것이 웹에 매달려있는 것 같아 .Config. 추가해야하는 구성 요소가 있습니까? 여기에 내가지고있어 현재 예외는 다음과 같습니다

:

서비스 MySolution.Express.Controllers.HomeController 을 지원하는 어떤 구성 요소가 여기에

를 찾을 수 없습니다

내 코드입니다 캐슬 윈저에 관한 Web.Config 부분

<section name="castle" 
      type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, 
      Castle.Windsor" /> 
    </configSections> 

    (....) 
<castle> 
    <components> 

    </components> 
    </castle> 

Global.ascx

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

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

    } 

    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterRoutes(RouteTable.Routes); 
     ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory()); 
     ControllerBuilder.Current.DefaultNamespaces.Add("MyProject.Express.Controllers"); 
    } 

WindsorControllerFactory.cs

WindsorContainer container; 

public WindsorControllerFactory() 
{ 
    container = new WindsorContainer(
        new XmlInterpreter(new ConfigResource("castle")) 
       ); 
    var controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes() 
         where typeof(IController).IsAssignableFrom(t) 
         select t; 
    foreach (Type t in controllerTypes) 
    container.AddComponentWithLifestyle(t.FullName,t, 
             LifestyleType.Transient); 
} 

protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType) 
{ 
    return (IController)container.Resolve(controllerType); 
} 
  • 내가 추가 할 필요가 구성 요소가 있는가?
  • 이 목표를 달성하기 위해 내가 할 수있는 다른 조치는 무엇입니까?
+0

사용중인 버전? 윈저의 등록 API를 사용하여 컨트롤러를 등록하지 않는 이유는 무엇입니까? –

답변

2

당신이 컨트롤러를 등록하는 데 사용하는 코드가 실행 조립보고있다 : 여기에있는 Web.Config 구성 요소입니다. 당신이 한 가지 해결책을 발견 했으므로 명시 적으로 컨트롤러를 등록하는 것입니다.

다른 방법으로, 컨트롤러 어셈블리에서 모든 컨트롤러를 등록 MvcContrib.Castle은 다음과 같은 것을 사용하여 WindsorControllerFactory 생성자에서 코드의 두 번째 줄을 교체 할 수 있습니다 사용하는 경우 :

container.RegisterControllers(typeof(HomeController).Assembly); 
2

그래, 알았다. 이 컨트롤러를 찾을 수 있도록

<component id="controller" type="MyProject.Express.Controllers.HomeController, MyProject.Express.Controllers" lifestyle="transient" /> 
관련 문제