5

No puedo configurar Windsor Container con asp.net web api, aunque funciona bien con el controlador regular (IController).No se pueden inyectar dependencias en Asp.net MVC 4 Web API Controller usando Windsor Container

Tengo el controlador regular y el controlador de API en el mismo proyecto.

Aquí está el código para el controlador regular que trabajar muy bien:

/// <summary> 
    /// Controller Factory class for instantiating controllers using the Windsor IoC container. 
    /// </summary> 
    public class WindsorControllerActivator : IControllerActivator 
    { 
     private readonly IWindsorContainer container; 
     public WindsorControllerActivator(IWindsorContainer container) 
     { 
      this.container = container; 
     } 
     public IController Create(RequestContext requestContext, Type controllerType) 
     { 
      var controller = (IController)container.GetService(controllerType); 
      return controller; 
     } 

} 

y en global.asax.cs

container.Register(Component.For<IWindsorContainer>().Instance(container)); 
    container.Register(Component.For<IControllerActivator>().ImplementedBy<WindsorControllerActivator>()); 

y a continuación es el código problemático:

public class WindsorApiControllerActivator : IHttpControllerActivator 
    { 
     private readonly IWindsorContainer container; 
     public WindsorApiControllerActivator(IWindsorContainer container) 
     { 
      this.container = container; 
     } 
     public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) 
     { 
      var controller = (IHttpController)container.GetService(controllerType); 
      return controller; 
     } 
    } 

e instalador:

container.Register(Component.For<IHttpControllerActivator>().ImplementedBy<WindsorApiControllerActivator>()); 

sin embargo, nunca podré ejecutar WindsorApiControllerActivator.

cuando pongo depurador en WindsorControllerActivator funciona como se esperaba, pero para WindsorApiControllerActivator nunca se ejecuta.

su ayuda será apreciada

+0

¿Cómo se registra su contenedor como el respositorio? – nemesv

+0

¿Por qué personalizas WindsorApiControllerActivator mientras que no veo ningún tratamiento especial? –

+0

Cuong le: porque estoy usando el objeto Session de Nhibernate en los controladores api
ISession NSession pública {get; conjunto; } VendorController público (sesión sesión) { NSession = session; } // API GET/ [HttpPost] pública IList Buscar (modelo SearchViewModel) { IList searchResultViewModels = SearchVenues (modelo); return searchResultViewModels; // return "Hello World"; } –

Respuesta

1

I añade el siguiente código en global.asax.cs, y funciona :)

_windsorContainer = new WindsorContainer(); 
    _windsorContainer.Install(new EventSorbetInstaller()); 
    DependencyResolver.SetResolver(new WindsorDependencyResolver(_windsorContainer)); 
    ServiceLocator.SetLocatorProvider(() => new WindsorServiceLocator(_windsorContainer)); 
    RegisterFilterProviders(FilterProviders.Providers, _windsorContainer); 

    var activator = _windsorContainer.Resolve<IHttpControllerActivator>(); 

    GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), activator); 
Cuestiones relacionadas