我已经将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[]
注册任何组件。我发现这种不对称违反直觉,因为我不确定为什么内核在解析它在构造函数/属性上发现的依赖关系时应该采取不同的行为,而不是在解析用户希望它解析的依赖关系时。
答案 0 :(得分:8)
Resolve
/ ResolveAll
的明确划分是由于容器中内部和无趣的实现细节。集合解析器是一个子 depenendcy 解析器,因此它仅适用于依赖项。
我同意这不是很直观。请随时登录Windsor的问题跟踪器中的门票。
答案 1 :(得分:0)
我猜这种行为的原因是在构造函数或属性注入中,Castle使用集合/数组表示法作为指示,应该在集合中返回所有实现。否则你需要一个特殊的接口或属性来告诉它。然后你必须在任何地方明确地引用Castle的集合。
但是,当直接从容器解析时,您实际上指定了需要解析的类型,并且您可以更具表现力(使用API)并且您可以明确地调用ResolveAll
。所以我认为这是一个设计妥协 - 实现IoC容器并不那么简单,因为你经常被语言的结构所束缚。