5

Non riesco a configurare Windsor Container con asp.net web API, sebbene funzioni correttamente con controller regolare (IController).Impossibile inserire le dipendenze in Asp.net MVC 4 Web API Controller utilizzando Windsor Container

Ho controller regolare e controller api nello stesso progetto.

Ecco il codice per il regolatore regolare che lavora bene:

/// <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; 
     } 

} 

in global.asax.cs

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

e sotto è il codice problematico:

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 programma di installazione:

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

tuttavia, non sono mai in grado di eseguire WindsorApiControllerActivator.

quando, metto il debugger in WindsorControllerActivator, funziona come previsto, ma per WindsorApiControllerActivator non viene mai eseguito.

il vostro aiuto sarà apprezzato

+0

Come si registra il contenitore come dependencyresolver? – nemesv

+0

Perché personalizzi WindsorApiControllerActivator mentre non vedo alcun trattamento speciale? –

+0

Cuong le: perché utilizzo l'oggetto Nhibernate Session nei controller api
public ISession NSession {get; impostato; } VendorController pubblico (sessione di sessione) { NSession = sessione; } // GET api/ [HttpPost] pubblico IList Ricerca (modello SearchViewModel) { IList searchResultViewModels = SearchVenues (modello); ritorno ricercaResultViewModels; // return "Hello World"; } –

risposta

1

ho aggiunto il seguente codice nel global.asax.cs, e funziona :)

_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);