No se puede agregar controladores a Castle.Windsor en ASP.NET MVC
-
25-09-2019 - |
Pregunta
Dada la siguiente configuración, tengo tres asambleas.
Web (ASP.NET MVC 3.0 RC1)
Modelos
Persistencia (Fluido NHibernate, Castle.Windsor)
Esta es mi 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));
}
}
}
Esta es mi 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);
}
}
}
Esta es mi Application_Start
en el archivo 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));
}
Estoy consiguiendo el error
No se encontró componente para soportar el servicio Project.Web.Controllers.HomeController
en el GetControllerInstance
.
Por lo tanto, no estoy realmente seguro de lo que estoy haciendo mal, y por qué no puedo conseguir los controladores registrados.
Solución
Su código de configuración de todo el castillo de Windsor pertenece en su proyecto web. No tiene nada que ver con la persistencia.
Esto está causando el problema, ya que su ControllerInstaller
está intentando registrar los controladores en la persistencia de montaje en lugar de la web de la Asamblea con el siguiente código:
System.Reflection.Assembly.GetExecutingAssembly()
.
Así que mover el código de la COI al proyecto Web y encontrará los controladores.