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
必须以某种方式处理。
嗯,我会试试看。如果是这种情况,那么它是一个失败的resharper! (它告诉我可以将其简化为原来的问题) –
ResolveAll方法没有“()”。至于lambda,编译器会插入它,因为它是一个方法组,但我不认为它是明显的/通常已知的。 –
@ GlennBlock,AntonyScott:请您发表相同的代码 –