Castle Windsor и обработчики сообщений веб-API WCF - PullRequest
1 голос
/ 25 января 2012

Я пытаюсь использовать Castle Windsor для создания своих обработчиков сообщений, потому что простое использование ...

MessageHandlers.Add(typeof(MyHandler));

... не позволяет мне использовать конструктор для внедрения других служб, напримерlogger

Итак, я создал установщик, который регистрирует все мои обработчики (из которых в настоящее время есть один!)

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

Это прекрасно работает, когда я запускаю его через отладчик Iможно увидеть дополнительную регистрацию компонента в контейнере.

Но когда я пытаюсь настроить фабрику обработчика сообщений для 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 (Решение)

У меня был конструктор для моего обработчика, например ...

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

... который не вызывался, несмотря на изменение кода инициализации для использования лямбды ...

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

... поэтому я добавил еще один конструктор, который просто берет ILogger и все хорошо.Я подумал, что мой контейнер не знает, что такое делегирующий обработчик, и что MessageHandlerFactory должно как-то с этим справиться.

1 Ответ

1 голос
/ 25 января 2012

Вам нужно использовать лямбду для инъекции ctor, поэтому она есть.Кстати, вам не хватает ()

Как вы регистрируете свои маршруты, передаете ли вы объект конфигурации?

...