2010-07-20 107 views
1

我需要找到一種方法將我的MVC控制器放入與MVC項目不同的項目中。ASP.NET MVC控制器在單獨集合和Castle Windsor

我想我很近。我已經安裝了Castle Windsor IoC容器,並將我的控制器安裝在不同的項目中。我認爲它掛在Web.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

您正在使用哪個版本?你爲什麼不使用Windsor的註冊API來註冊控制器? – 2010-07-20 01:17:28

回答

2

您使用註冊控制器的代碼是看執行的程序集,所以它不會找到這些控制器。正如你發現一個解決方案是明確註冊控制器。

另外,如果你使用MvcContrib.Castle那麼你可以像這樣的東西代替的第二行代碼在你WindsorControllerFactory構造函數註冊從控制器組件所有控制器:

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

好吧,我明白了。這裏的程序Web.Config組件:

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