Castle Windsor CollectionResolver:为什么它不适用于Resolve调用?

时间:2011-05-03 05:22:23

标签: castle-windsor ioc-container

我已经将CollectionResolver添加为我的Windsor内核的子解析器,它将正确地为已解析的对象注入依赖项集合。也就是说,如果我有

class X { public X(IComponent[] components) { ... } }
container.Register(/* lots of IComponents */);
container.Register(Component.For<X>());

构造函数的components参数在我解析后正确构造

container.Resolve<X>()

但如果相反我只想获得组件列表,

container.Resolve<IComponent[]>()

我收到ComponentNotFound个异常抱怨我没有为IComponent[]注册任何组件。我发现这种不对称违反直觉,因为我不确定为什么内核在解析它在构造函数/属性上发现的依赖关系时应该采取不同的行为,而不是在解析用户希望它解析的依赖关系时。

2 个答案:

答案 0 :(得分:8)

Resolve / ResolveAll的明确划分是由于容器中内部和无趣的实现细节。集合解析器是一个子 depenendcy 解析器,因此它仅适用于依赖项。

我同意这不是很直观。请随时登录Windsor的问题跟踪器中的门票。

答案 1 :(得分:0)

我猜这种行为的原因是在构造函数或属性注入中,Castle使用集合/数组表示法作为指示,应该在集合中返回所有实现。否则你需要一个特殊的接口或属性来告诉它。然后你必须在任何地方明确地引用Castle的集合。

但是,当直接从容器解析时,您实际上指定了需要解析的类型,并且您可以更具表现力(使用API​​)并且您可以明确地调用ResolveAll。所以我认为这是一个设计妥协 - 实现IoC容器并不那么简单,因为你经常被语言的结构所束缚。