2010-07-20 10 views
1

Je dois trouver un moyen de placer mes contrôleurs MVC dans un projet différent du projet MVC.Contrôleurs ASP.NET MVC dans des assemblages distincts et Castle Windsor

Je pense que je suis proche. J'ai installé le conteneur Castle Windsor IoC et j'ai mes contrôleurs dans un autre projet. Je pense qu'il raccroche sur le Web.Config. Y a-t-il un composant que je dois ajouter? Voici l'exception actuelle, je reçois:

Aucun composant pour soutenir le services MySolution.Express.Controllers.HomeController a été trouvé

Voici mon code:

Web.Config partie qui appartient à Castle Windsor

<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); 
} 
  • Y at-il un élément que je dois ajouter?
  • Que puis-je faire d'autre pour atteindre cet objectif?
+0

la version que vous utilisez? Pourquoi n'utilisez-vous pas l'API d'enregistrement de Windsor pour enregistrer les contrôleurs? –

Répondre

2

Le code que vous utilisez pour enregistrer les contrôleurs cherche à l'assemblée exécution il ne trouvera pas les contrôleurs. Comme vous l'avez découvert, une solution consiste à enregistrer explicitement les contrôleurs.

Sinon, si vous utilisez MvcContrib.Castle alors vous pouvez remplacer la deuxième ligne de code dans votre constructeur WindsorControllerFactory avec quelque chose comme celui-ci pour enregistrer tous les contrôleurs de l'ensemble de commande:

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

D'accord, je l'ai compris. Voici le composant web.config:

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