castle-windsor – 如何恢复Castle 3中的旧CollectionResolver行为?

我正在使用CollectionResolver(更具体地说是ListResolver)来支持我们想要注入接口的多个实现的场景. CollectionResolver的行为受到Castle 3中ResolveAll()更改的影响.以前,ResolveAll()只返回那些可以解析的实现,并默默地忽略任何无法解析的已注册实现.现在,如果无法解析任何一个已注册的实现,ResolveAll()将失败.

总的来说,我认为这是一个很好的改变,因为它确保我们实际上获得了我们认为的所有实现.但是,我有几个场景,我实际上使用旧的行为对我有利.我有一个基础设施组件(IBar),由一个普通的安装程序注册,它依赖于IFoo的集合(由集合解析器完成).在通用安装程序中,我还注册了一些IFoo实现,但这些实现依赖于可能注册或未注册的服务.这个想法是客户端可以通过注册依赖服务来“激活”IFoo的这种实现.以前,如果客户端没有注册特定IFoo的依赖关系,那么IFoo的实现就不会被注入IBar(而其他可解析的实现也会被注入).现在IBar的分辨率在这种情况下失败了,因为无法解析(以前可选的)IFoo.

有没有办法轻松恢复旧的行为?理想情况下,我希望默认使用新行为,但恢复为特定服务的旧行为(在这种情况下为IFoo).我已经尝试创建一个IHandlersFilter实现来实现这一点,但我发现不可能过滤掉所有候选处理程序(从SelectHandlers返回一个空数组) – 如果我尝试,Windsor忽略过滤器并尝试无论如何解决所有候选处理程序.

有任何想法吗?如果你认为我以错误的方式解决这个问题,我也会采取完全不同的方法来实现我的目标.

最佳答案
您可以在Windsor中使用一个名为IHandlersFilter的新扩展点来精确控制ResolveAll行为.有关示例,请参见this blogpost.

转载注明原文:castle-windsor – 如何恢复Castle 3中的旧CollectionResolver行为? - 代码日志