如何为Sitecore MVC Web Api控制器设置Windsor

时间:2015-08-19 09:48:18

标签: asp.net-mvc asp.net-web-api sitecore castle-windsor sitecore8

我为我的控制器实现了一个Windsor,如此处所述 http://sitecore-estate.nl/wp/2014/12/sitecore-mvc-dependency-injection-using-castle-windsor/ 并设置我的WebApi,如https://kb.sitecore.net/en/Articles/2015/07/15/11/30/700677.aspx

对于常规控制器来说效果很好。但我想知道如何将它用于ApiController。下一步方式不起作用

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

1 个答案:

答案 0 :(得分:1)

这个问题的答案就像使用 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));

            }
        }

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