我无法让Castle Windsor(3.0)解析数组。我之前已经完成了它并且我解决了其他阵列,所以这很混乱。
首先我添加一个CollectionResolver
,它执行数组
_container.Kernel.Resolver.AddSubResolver(new CollectionResolver(_container.Kernel));
然后,我根据这个界面注册我的所有类,其中大约有6个
container.Register(AllTypes.FromThisAssembly().BasedOn<ISearchSource>());
它们肯定在同一个程序集和调试器中,我可以看到这些类在组件列表中,例如。
public class ViewsSearchSource : ISearchSource {...}
然而在解决这个问题的课程中,就像这样......
public SearchBot(ISearchSource[] searchSources)
我得到了
&#39; SearchBot&#39;正在等待以下依赖项服务&#39; ISearchSource []&#39;没有注册。
我甚至尝试过明确添加ArrayResolver
(以及CollectionResolver
)。同样的错误。
我在这里缺少什么?
答案 0 :(得分:1)
AllInterfaces是必要的,因为您依赖于接口类型:“AllTypes.FromThisAssembly()。BasedOn()”选择实现ISearchSource的所有类型,但这些类型将在具体类型的容器中注册,而不是使用接口(已被用作依赖)。
PS:我建议您使用Classes而不是AllTypes。
“WithServiceDefaultInterfaces()”就足够了。
请记住,windsor根据注册解析依赖关系:IOW你必须标记(在组件注册期间)你的具体所有接口,你将用作依赖。
当你在调试时,在容器上添加一个监视/断点,以查看所有已注册的组件和界面/具体的“链接/分配”到你的组件:揭示分辨率背后的魔力。
答案 1 :(得分:0)
我需要像这样注册
container.Register(AllTypes.FromThisAssembly().BasedOn<ISearchSource>().WithService.AllInterfaces());
即必须添加WithService.AllInterfaces());
我实际上不明白为什么这里需要这个AllInterfaces,但是它有效。