2010-12-09 28 views
1

Étant donné la configuration suivante, j'ai trois assemblys.Impossible d'ajouter des contrôleurs à Castle.Windsor dans ASP.NET MVC

Web (ASP.NET MVC 3.0 RC1)

modèles

Persistance (Courant NHibernate, Castle.Windsor)

Ceci est mon ControllerInstaller.

using System; 
using System.Web.Mvc; 

using Castle; 
using Castle.Windsor; 

using Castle.MicroKernel; 
using Castle.MicroKernel.SubSystems; 
using Castle.MicroKernel.Registration; 
using Castle.MicroKernel.SubSystems.Configuration; 

namespace Persistence.Installers 
{ 
    public class ControllerInstaller : IWindsorInstaller 
    { 
     public void Install(IWindsorContainer container, IConfigurationStore store) 
     { 
      container.Register(
      AllTypes 
       .FromAssembly(System.Reflection.Assembly.GetExecutingAssembly()) 
       .BasedOn<IController>() 
       .Configure(c => c.Named(
        c.Implementation.Name.ToLowerInvariant()).LifeStyle.Transient)); 
     } 
    } 
} 

Ceci est mon ControllerFactory ...

using System; 
    using System.Web; 
    using System.Web.Mvc; 

    namespace Persistence.Containers 
    { 
     /// <summary> 
     /// Utilize Castle.Windsor to provide Dependency Injection for the Controller Factory 
     /// </summary> 
     public class WindsorControllerFactory : DefaultControllerFactory 
     { 
      private readonly Castle.Windsor.IWindsorContainer container; 

      public WindsorControllerFactory() 
      { 
       container = WindsorContainerFactory.Current(); 
      } 

      protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType) 
      { 
       return (IController)container.Resolve(controllerType); 
      } 
     } 
    } 

Ceci est mon Application_Start dans le fichier global.asax ..

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 

     // Register the Windsor Container 
     ControllerBuilder.Current 
      .SetControllerFactory(typeof(Persistence.Containers.WindsorControllerFactory)); 
    } 

Je reçois l'erreur

Non composant pour soutenir le service Pro ject.Web.Controllers.HomeController a été trouvé

au GetControllerInstance. Donc, je ne suis pas vraiment sûr de ce que je fais mal, et pourquoi je ne peux pas obtenir les contrôleurs enregistrés.

Répondre

1

Votre code d'installation Castle Windsor appartient à votre projet Web. Cela n'a rien à voir avec la persistance.

Cela provoque le problème parce que votre ControllerInstaller tente d'enregistrer les contrôleurs dans l'assemblage Persistence plutôt que l'ensemble de Web avec le code suivant:

System.Reflection.Assembly.GetExecutingAssembly(). Déplacez donc le code IoC vers le projet Web et il trouvera vos contrôleurs.

+0

Donc, je ne pouvais pas dire "FromAssemblyNamed ('nameofWeb.dll')" et obtenir le même résultat? Y a-t-il une raison spécifique pour que cela fonctionne de cette façon? – Ciel

+0

@Stacey: Comme je l'ai écrit [ici] (http://stackoverflow.com/questions/4401244/castle-windsor-ioc-in-an-mvc-application/4402870#4402870) c'est vraiment la responsabilité des applications de configurer le conteneur IoC. Il n'a * rien * à voir avec la couche de persistance. La couche de persistance est souvent partagée entre différentes applications, mais la couche de persistance ne doit pas être consciente de toutes les autres dépendances que vos applications peuvent avoir. – cspolton

+0

Vous pouvez techniquement changer votre code à 'FromAssemblyNamed (" Web ")' pour le faire fonctionner, mais cela ne vous aiderait pas à comprendre comment mettre au mieux le code dans votre solution – cspolton