2012-01-25 33 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:请您发表相同的代码 –