我正在尝试使用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
必须以某种方式处理它。
答案 0 :(得分:1)
你需要使用lambda进行ctor注射,这就是它存在的原因。顺便说一下,你错过了一个()
如何通过配置对象传递路由?