Não é possível adicionar controladores ao castle.windsor no ASP.net MVC
-
25-09-2019 - |
Pergunta
Dada a seguinte configuração, tenho três assembléias.
Web (ASP.NET MVC 3.0 RC1)
Modelos
Persistência (Nibernato fluente, castelo.windsor)
Este é o meu controlador.
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));
}
}
}
Este é o meu controlador Factory ...
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);
}
}
}
Este é meu Application_Start
no global.asax
Arquivo..
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
// Register the Windsor Container
ControllerBuilder.Current
.SetControllerFactory(typeof(Persistence.Containers.WindsorControllerFactory));
}
Estou recebendo o erro
Nenhum componente para apoiar o projeto de serviço.web.controllers.homecontroller foi encontrado
no GetControllerInstance
.
Então, não tenho muita certeza do que estou fazendo de errado e por que não consigo registrar os controladores.
Solução
O código de configuração do seu castelo Windsor pertence ao seu projeto da web. Não tem nada a ver com persistência.
Isso está causando o problema porque seu ControllerInstaller
está tentando registrar os controladores na assembléia de persistência, em vez da montagem da web com o seguinte código:
System.Reflection.Assembly.GetExecutingAssembly()
.
Portanto, mova o código do COI para o projeto da Web e ele encontrará seus controladores.