É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.
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
@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
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