Castle Windsor和WCF Web Api消息处理程序

时间:2012-01-25 16:55:52

标签: castle-windsor wcf-web-api

我正在尝试使用Castle Windsor创建我的消息处理程序,因为只使用...

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))
            );
    }
}

这很好用,当我通过调试器运行时,我可以在容器中看到额外的组件注册。

但是当我尝试为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);
}

编辑2 (解决方案)

我的Handler有一个构造函数,就像这样...

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

...尽管更改了初始化代码以使用lambda ...但未被调用...

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

...所以我添加了另一个构造函数,只需要ILogger,一切都很好。我想我的容器不知道委托处理程序是什么,MessageHandlerFactory必须以某种方式处理它。

1 个答案:

答案 0 :(得分:1)

你需要使用lambda进行ctor注射,这就是它存在的原因。顺便说一下,你错过了一个()

如何通过配置对象传递路由?