2

我也喜歡這裏描述 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如何設置溫莎Sitecore的MVC網頁API控制器

定期控制器是做工不錯實施溫莎我的控制器。但我想知道如何將它用於ApiController。接下來的方式是行不通的

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

http://stackoverflow.com/問題/ 9557909/castle-windsor-apicontroller-factory-implementation-for-asp-net-web-api –

+0

嘿,那個博客看起來對我來說很熟悉;)! – Younes

回答

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>