2011-09-12 5 views
4

J'utilise Castle Windsor 3.0 et cela a fonctionné parfaitement pour moi jusqu'à ce que j'essaie d'enregistrer les contrôleurs (j'ai utilisé WCF facility et IoC pour la couche de dépôt/service). Voici mes contrôleurs classe d'installation:Contrôleurs Castle windsor 3.0 et ASP.NET MVC

public class ControllersInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     RegisterAllBasedOnWithCustomComponentRegistration(container, typeof(IController), 
      typeof(HomeController).Assembly, 
      cr => cr.LifeStyle.Transient); 

    } 

    private void RegisterAllBasedOnWithCustomComponentRegistration(IWindsorContainer container, Type baseType, 
    Assembly assemblyWithImplementations, Func<ComponentRegistration, ComponentRegistration<object>> customComponentRegistrationCb) 
    { 
     container.Register(
      AllTypes.FromAssembly(assemblyWithImplementations) 
       .BasedOn(baseType) 
       .If(t => t.Name.EndsWith("Controller")) 
       .Configure(c => customComponentRegistrationCb(c))); 
    } 
} 

Et voici mon usine de contrôleur:

public class WindsorControllerFactory : DefaultControllerFactory 
{ 
    private readonly IKernel _kernel; 

    public WindsorControllerFactory(IKernel kernel) 
    { 
     _kernel = kernel; 
    } 

    public override void ReleaseController(IController controller) 
    { 
     _kernel.ReleaseComponent(controller); 
    } 

    public override IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName) 
    { 
     var controllerComponentName = controllerName + "Controller"; 
     return _kernel.Resolve<IController>(controllerComponentName); 
    } 
} 

De mon global.asax j'appelle la méthode suivante:

InversionOfControl.InstallControllers (FromAssembly .Ce());

qui se trouve dans un autre projet. Et là, je fais appeler le code d'installation:

public static void InstallControllers(IWindsorInstaller install) 
    { 
     _container.Install(install); 
    } 

il semble que je suis en train de faire quelque chose de mal et j'espère que je suis parce que ce pourrait être un moment « ne jamais utiliser de nouveau bêta Awny » pour moi.

Je reçois la prochaine exception: n'a été trouvé aucun élément pour soutenir le System.Web.Mvc.IController service barbante Je peux voir le contrôleur en mode de débogage étant enregistré dans le conteneur

+0

Il est là, dans le message d'exception. Il semble que vous essayez de résoudre votre contrôleur en tant que 'IController' plutôt que sa classe d'implémentation –

+0

Eh bien, je lui demande de résoudre exactement HomeController dans controllerName, pas IController. Peut-être que je me trompe, n'est-ce pas? –

Répondre

1

Dans ce cas, ajoutez .WithServices (typeof (iController)) et le nom de tous les composants.

cr => cr.LifeStyle.Transient.Named(cr.Implementation.Name) 

et votre inscription devrait ressembler à:

.Register(
AllTypes.FromAssembly(assemblyWithImplementations) 
     .BasedOn(baseType) 
     .WithServices(typeof(IController)) 
     .If(t => t.Name.EndsWith("Controller"))...) 
+0

sauf que la partie 'WithService' est fausse et ne fonctionnera que par accident, parce que vous pointez sur le composant spécifique que vous voulez via son nom, en ignorant les services qu'il expose. –

+0

oui vous avez raison. Dans ce cas, WindsorControllerFactory devrait être refactorisé comme Mark Seemann suggéré ci-dessous. – isuruceanu

9

Dans votre ControllerFactory, vous ne devriez pas Resolve IController mais plutôt le type de contrôleur de béton. Voici un ControllerFactory typique de base Windsor J'utilise toujours:

public class WindsorControllerFactory : DefaultControllerFactory 
{ 
    private readonly IWindsorContainer _container; 

    public WindsorControllerFactory(IWindsorContainer container) 
    { 
     _container = container; 
    } 

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     return (IController)_container.Resolve(controllerType); 
    } 

    public override void ReleaseController(IController controller) 
    { 
     _container.Release(controller); 
    } 
} 
+0

Pourquoi le downvote anonyme? –

+0

Ce n'était pas moi, Mark –

+1

désolé au lieu de voter, je vote accidentellement vers le bas, je confirme que votre solution est plus élégante. – isuruceanu

Questions connexes