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
必須以某種方式處理。
嗯,我會試試看。如果是這種情況,那麼它是一個失敗的resharper! (它告訴我可以將其簡化爲原來的問題) –
ResolveAll方法沒有「()」。至於lambda,編譯器會插入它,因爲它是一個方法組,但我不認爲它是明顯的/通常已知的。 –
@ GlennBlock,AntonyScott:請您發表相同的代碼 –