Я пытаюсь использовать 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
должно как-то с этим справиться.