Ok, Phil's link pointed me in the right direction. I'll share my solution in case anyone is having the same problem.
This should be in Global.asax.cx (Application_Start method)
// Set the dependency resolver for Web API.
var webApicontainer = new WindsorContainer().Install(new WebWindsorInstaller());
GlobalConfiguration.Configuration.DependencyResolver = new WebApiWindsorDependencyResolver(webApicontainer);
// Set the dependency resolver for Mvc Controllers
Container = new WindsorContainer()
.Install(new ControllersInstaller());
DependencyResolver.SetResolver(new MvcWindsorDependencyResolver(Container));
ServiceLocator.SetLocatorProvider(() => new WindsorServiceLocator(Container));
var controllerFactory = new WindsorControllerFactory(Container.Kernel);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
WebApiWindsorDependecyResolver
internal class WebApiWindsorDependencyResolver : IDependencyResolver
{
private readonly IWindsorContainer container;
public WebApiWindsorDependencyResolver(IWindsorContainer container)
{
if (container == null) { throw new ArgumentNullException("container"); }
this.container = container;
}
public object GetService(Type t)
{
return this.container.Kernel.HasComponent(t) ? this.container.Resolve(t) : null;
}
public IEnumerable<object> GetServices(Type t)
{
return this.container.ResolveAll(t).Cast<object>().ToArray();
}
public IDependencyScope BeginScope()
{
return new ReleasingDependencyScope(this as IDependencyScope, this.container.Release);
}
public void Dispose()
{
}
}
MvcWindsorDependencyResolver
internal class MvcWindsorDependencyResolver : IDependencyResolver
{
private readonly IWindsorContainer container;
public MvcWindsorDependencyResolver(IWindsorContainer container)
{
this.container = container;
}
public object GetService(Type serviceType)
{
return container.Kernel.HasComponent(serviceType) ? container.Resolve(serviceType) : null;
}
public IEnumerable<object> GetServices(Type serviceType)
{
return container.Kernel.HasComponent(serviceType) ? container.ResolveAll(serviceType).Cast<object>() : new object[] { };
}
}
ControllerInstaller
public class ControllersInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(FindControllers().Configure(c => c.LifestyleTransient()));
container.Register(Component
.For<RepositoryFactories>()
.ImplementedBy<RepositoryFactories>()
.LifestyleSingleton());
container.Register(Component
.For<IRepositoryProvider>()
.ImplementedBy<RepositoryProvider>()
.LifestylePerWebRequest());
container.Register(Component
.For<IProjUow>()
.ImplementedBy<ProjUow>()
.LifestylePerWebRequest());
}
private static BasedOnDescriptor FindControllers()
{
return AllTypes.FromThisAssembly()
.BasedOn<IController>()
.If(t => t.Name.EndsWith("Controller"));
}
}
WebWindsorInstaller
internal class WebWindsorInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Component
.For<RepositoryFactories>()
.ImplementedBy<RepositoryFactories>()
.LifestyleSingleton());
container.Register(Component
.For<IRepositoryProvider>()
.ImplementedBy<RepositoryProvider>()
.LifestylePerWebRequest());
container.Register(Component
.For<IProjUow>()
.ImplementedBy<ProjUow>()
.LifestylePerWebRequest());
container.Register(Classes
.FromAssemblyContaining<Api.CategoriesController>()
.BasedOn<IHttpController>()
.If(t => t.Name.EndsWith("Controller"))
.LifestylePerWebRequest());
}
}
The only thing I don't get quite well (despite this works) is Why do I need to have two classes DependencyResolver (WebApiWindsorDependencyResolver and MvcWindsorDependencyResolver) when they are almost the same. Can I get rid of one of them?
If I change the code and instead of
DependencyResolver.SetResolver(new MvcWindsorDependencyResolver(Container));
I write
DependencyResolver.SetResolver(new WebApiWindsorDependencyResolver(Container));
It says
The type Proj.UI.Cms.Infrastructure.WebApiWindsorDependencyResolver does not appear to implement Microsoft.Practices.ServiceLocation.IServiceLocator.
Parameter name: commonServiceLocator
But both classes seems to share the same code.
Best Regards. Guillermo.