5

Nie mogę skonfigurować Windsor Container z ap.net web api, chociaż działa dobrze z regularnym kontrolerem (IController).Nie można wstrzyknąć zależności w Asp.net MVC 4 Web API Controller przy użyciu Windsor Container

Mam regularny kontroler i kontroler api w tym samym projekcie.

Oto kod do regularnego kontroler, który działa bez zarzutu:

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

} 

aw Global.asax.cs

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

i poniżej jest kod problematyczne:

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

i instalator:

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

Jednak ja nigdy nie jestem w stanie wykonać WindsorApiControllerActivator.

Kiedy umieścić debugger w WindsorControllerActivator działa zgodnie z oczekiwaniami, ale dla WindsorApiControllerActivator nigdy nie zostanie wykonany.

Twoja pomoc będzie mile widziane

+0

Jak zarejestrować swój kontener jako zależność? – nemesv

+0

Dlaczego dostosowujesz WindsorApiControllerActivator, ale nie widzę specjalnego traktowania? –

+0

Cuong le: ponieważ korzystam z obiektu Nhibernate Session w kontrolerach api
public NSession {get; zestaw; } public VendorController (sesja ISession) { NSession = sesja; } // GET API/ [HttpPost] publicznych IList wyszukiwania (wzór SearchViewModel) { IList searchResultViewModels = SearchVenues (model); return searchResultViewModels; // return "Hello World"; } –

Odpowiedz

1

I dodaje następujący kod w Global.asax.cs i działa :)

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