2012-01-25 30 views
1

我試圖使用溫莎城堡,因爲只是用創建我的消息處理程序...溫莎城堡和WCF的Web API消息處理程序

MessageHandlers.Add(typeof(MyHandler)); 

...不允許我使用的構造函數注入其他服務,例如記錄器

所以,我創造出我註冊的所有處理程序的安裝程序(其中有一個現在!)

public class MessageHandlerInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(
      AllTypes 
       .FromThisAssembly() 
       .Where(t => t.IsSubclassOf(typeof (DelegatingHandler))) 
       .Configure(c => c.LifeStyle.Custom(InstallerContext.LifestyleManager)) 
      ); 
    } 
} 

這工作得很好,當我通過運行DEB ugger我可以在容器中看到額外的組件註冊。

但是,當我嘗試爲WCF Web Api設置消息處理程序工廠時,它似乎不起作用。 (我在SendAsync方法中有斷點,永遠不會被擊中)

public class MyApiConfiguration : WebApiConfiguration 
{ 
    public MyApiConfiguration(IWindsorContainer container) 
    { 
     EnableTestClient = true; 
     IncludeExceptionDetail = true; 

     CreateInstance = ((serviceType, context, request) => container.Resolve(serviceType)); 
     ErrorHandlers = (handlers, endpoint, description) => handlers.Add(container.Resolve<GlobalErrorHandler>()); 
     MessageHandlerFactory =() => container.ResolveAll<DelegatingHandler>(); 
    } 
} 

所以,我明顯錯過了一些東西。我只是不知道它是什麼。任何人都可以啓發我嗎?

編輯(額外的配置代碼,如要求)

public void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    AddServiceRoutes(routes); 
} 

private static void AddServiceRoutes(RouteCollection routes) 
{ 
    Container = WindsorContainerBootStrap.CreateContainerAndInstallComponents<PerThreadLifestyleManager>(); 
    var config = new EtailApiConfiguration(Container); 
    routes.MapServiceRoute<CustomersApi>("customer", config); 
    routes.MapServiceRoute<ConsumerApi>("consumer", config); 
    routes.MapServiceRoute<PricePlansApi>("priceplans", config); 
} 

EDIT 2(解決方案)

我有一個構造函數,我的處理程序是這樣的...

public MyHandler(DelegatingHandler innerChannel, ILogger logger) 
     : base(innerChannel) 
    { 
     _logger = logger; 
    } 

...儘管將init代碼更改爲使用lambda表達式,但仍未得到調用...

MessageHandlerFactory =() => container.ResolveAll<DelegatingHandler>(); 

...所以我添加了另一個構造函數,只需要一個​​,一切都很好。我想我的容器不知道委託處理程序是什麼,並且MessageHandlerFactory必須以某種方式處理。

回答

1

您需要使用lambda進行ctor注射,這就是爲什麼它在那裏。順便說一句,你缺少一個()

你如何註冊你的路線,你是否傳遞配置對象?

+0

嗯,我會試試看。如果是這種情況,那麼它是一個失敗的resharper! (它告訴我可以將其簡化爲原來的問題) –

+1

ResolveAll方法沒有「()」。至於lambda,編譯器會插入它,因爲它是一個方法組,但我不認爲它是明顯的/通常已知的。 –

+0

@ GlennBlock,AntonyScott:請您發表相同的代碼 –