【问题标题】:ASP.NET MVC controllers in separate assembies and Castle Windsor单独程序集中的 ASP.NET MVC 控制器和 Castle Windsor
【发布时间】:2010-07-20 00:08:29
【问题描述】:

我需要找到一种方法将我的 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>

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);
 }
  • 是否有我需要添加的组件?
  • 我还能做些什么来实现这个目标?

【问题讨论】:

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

标签: asp.net-mvc-2 castle-windsor ioc-container


【解决方案1】:

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

或者,如果您使用 MvcContrib.Castle,那么您可以将 WindsorControllerFactory 构造函数中的第二行代码替换为类似这样的内容,以从控制器程序集中注册所有控制器:

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

【讨论】:

    【解决方案2】:

    好的,我明白了。这是 Web.Config 组件:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多