Asp.net mvc 2 ASP.NET MVC控制器在单独的assembies和Castle Windsor中

Asp.net mvc 2 ASP.NET MVC控制器在单独的assembies和Castle Windsor中,asp.net-mvc-2,castle-windsor,ioc-container,Asp.net Mvc 2,Castle Windsor,Ioc Container,我需要找到一种方法,将我的MVC控制器放入与MVC项目不同的项目中 我想我很接近了。我已经设置了Castle Windsor IoC容器,并将我的控制器放在另一个项目中。我想它挂在Web.Config上了。是否有需要添加的组件?以下是我得到的当前例外情况: 没有用于支持系统的组件 服务 MySolution.Express.Controllers.HomeController 被发现 这是我的密码: 属于温莎城堡的Web.Config部分 <section name="castle"

我需要找到一种方法,将我的MVC控制器放入与MVC项目不同的项目中

我想我很接近了。我已经设置了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>
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);
 }
  • 是否有需要添加的组件
  • 我还能做些什么来实现这个目标

    • 好的,我知道了。下面是Web.Config组件:

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

      好的,我知道了。下面是Web.Config组件:

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

      用于注册控制器的代码正在查看正在执行的程序集,因此它找不到控制器。正如您所发现的,一种解决方案是显式注册控制器

      或者,如果使用MvcContrib.Castle,则可以使用类似以下内容替换WindsorController Factory构造函数中的第二行代码,以注册控制器程序集中的所有控制器:

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

      用于注册控制器的代码正在查看正在执行的程序集,因此它找不到控制器。正如您所发现的,一种解决方案是显式注册控制器

      或者,如果使用MvcContrib.Castle,则可以使用类似以下内容替换WindsorController Factory构造函数中的第二行代码,以注册控制器程序集中的所有控制器:

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

      您使用的是哪个版本?为什么不使用Windsor的注册API来注册控制器?您使用的是哪个版本?为什么不使用Windsor的注册API来注册控制器?