如何在Castle 3中恢复旧的CollectionResolver行为?

时间:2011-12-16 18:36:45

标签: castle-windsor

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

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

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

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

1 个答案:

答案 0 :(得分:1)

您可以在Windsor中使用名为IHandlersFilter的新扩展点来精确控制ResolveAll行为。有关示例,请参阅this blogpost