Arbejdsglæde
Arbejdsglæde

Reputation: 14088

How to set up Windsor for Sitecore MVC Web Api Controller

I have implemented a Windsor for my controller like described here http://sitecore-estate.nl/wp/2014/12/sitecore-mvc-dependency-injection-using-castle-windsor/ and set up my WebApi like here https://kb.sitecore.net/en/Articles/2015/07/15/11/30/700677.aspx

for regular controller it is works good. But I wonder how to use it for ApiController. Next way is not working

public void Install(IWindsorContainer container, IConfigurationStore store)
    {
               container.Register(Classes.FromThisAssembly().BasedOn<IHttpController>().LifestyleTransient());
    }

Upvotes: 2

Views: 792

Answers (1)

Arbejdsgl&#230;de
Arbejdsgl&#230;de

Reputation: 14088

Yes answer for this question would be like use IHttpControllerActivator:

public class WindsorHttpControllerFactory : IHttpControllerActivator
{
    private readonly IWindsorContainer _container;

    public WindsorHttpControllerFactory(IWindsorContainer container)
    {
        _container = container;
    }

    public IHttpController Create(HttpRequestMessage request,
                                  HttpControllerDescriptor controllerDescriptor,
                                  Type controllerType)
    {
        var controller =
        (IHttpController)_container.Resolve(controllerType);

        request.RegisterForDispose(
            new Release(
                () => _container.Release(controller)));

        return controller;
    }

    class Release : IDisposable
    {
        readonly Action _release;

        public Release(Action release)
        {
            _release = release;
        }

        public void Dispose()
        {
            _release();
        }
    }
}
    public class WebApiInstaller : IWindsorInstaller
    {
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            container.Register(Types.FromThisAssembly().BasedOn<IHttpController>().LifestyleTransient());            
        }
    }

     public class InitializeWindsorControllerFactory
        {
            public virtual void Process(PipelineArgs args)
            {
                SetupControllerFactory(args);
            }

            public virtual void SetupControllerFactory(PipelineArgs args)
            {
                IWindsorContainer container = new WindsorContainer().Install(FromAssembly.This());
                IControllerFactory controllerFactory = new WindsorControllerFactory(container.Kernel);
                SitecoreControllerFactory sitecoreControllerFactory = new SitecoreControllerFactory(controllerFactory);

                System.Web.Mvc.ControllerBuilder.Current.SetControllerFactory(sitecoreControllerFactory);

                GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator),new WindsorHttpControllerFactory(container));

            }
        }

and config settings for

 <pipelines>
      <initialize>
<processor type="My.IoC.InitializeWindsorControllerFactory, My.IoC" patch:instead="*[type='Sitecore.Mvc.Pipelines.Loader.InitializeControllerFactory, Sitecore.Mvc']"/>
  </initialize>
</pipelines>

Upvotes: 1

Related Questions