Контроллеры ASP.NET MVC в отдельных сборках и замок Виндзор - PullRequest
1 голос
/ 20 июля 2010

Мне нужно найти способ поместить мои контроллеры MVC в проект, отличный от проекта MVC.

Я думаю, что я близок.Я установил IoC-контейнер Castle Windsor и у меня есть контроллеры в другом проекте.Я думаю, что это зависает на 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);
 }
  • Есть ли компонент, который мне нужно добавить?
  • Что еще я могу сделать для достижения этой цели?

Ответы [ 2 ]

2 голосов
/ 20 июля 2010

Код, который вы используете для регистрации контроллеров, просматривает исполняющуюся сборку, поэтому он не находит контроллеры. Как вы узнали, одним из решений является явная регистрация контроллеров.

В качестве альтернативы, если вы используете MvcContrib.Castle, вы можете заменить вторую строку кода в конструкторе WindsorControllerFactory чем-то вроде этого, чтобы зарегистрировать все контроллеры из сборки контроллера:

container.RegisterControllers(typeof(HomeController).Assembly);
2 голосов
/ 20 июля 2010

Хорошо, я понял. Вот компонент Web.Config:

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