如何通过接口注册数组,然后通过显式类名检索一个对象

时间:2014-07-03 06:31:41

标签: .net castle-windsor

我使用实现接口ISearchSource

的Castle.Windsor注册了一堆类
container.Register(AllTypes.FromThisAssembly().BasedOn<ISearchSource>().WithService.AllInterfaces());

其中一个是通过CollecctionResolver

解决的
public SearchBot(ISearchSource[] searchSources)

到目前为止很好。

现在,我想得到其中一个(一个ViewSearchSource),它必须是通过上面的构造函数解决的同一个,因为我在某种生活方式中)

并像这样解决它

Container.Resolve<ViewSearchSource>("ViewSearchSource").Bla();

我尝试了这个(以及许多其他的东西),但它给我一个第二个(不同的/单独的)对象 - 我不能拥有

container.Register(Component.For<ISearchSource>()
                                    .ImplementedBy<ViewSearchSource>()
                                    .Named(typeof(ViewSearchSource).Name));

有谁知道我需要做什么?

附录

我最终这样做 - 这是一种需要静态服务定位器的解决方法。

Container.Resolve<ISearchSource>(typeof(ViewSearchSource).ToString());

所以基本上,这需要所有已注册的ISearchSource对象(从我注册的6个左右依赖于CollectionResolver)并返回我通过字符串传递的类型

我仍然希望能够使用显式类名ViewSearchSource来使用构造函数注入,但还没有想出如何执行此操作。

某种转发&#39;需要例如Component.For<I1, I2>,但因为我需要在AllInterfaces()注册和单个组件注册之间拆分注册,我看不到使用Castle实现此目的的方法

2 个答案:

答案 0 :(得分:0)

我最终这样做 - 这是一种需要静态服务定位器的解决方法。

Container.Resolve<ISearchSource>(typeof(ViewSearchSource).ToString());

所以基本上,这需要所有已注册的ISearchSource对象(从我注册的6个左右依赖于CollectionResolver)并返回我通过字符串传递的类型

我仍然希望能够使用显式类名ViewSearchSource来使用构造函数注入,但还没有想出如何执行此操作。

需要某种转发,例如Component.For<I1, I2>但是因为我需要在AllInterfaces()注册和单个组件注册之间拆分注册,我无法看到使用Castle实现此目的的方法

答案 1 :(得分:0)

使用ISubDependencyResolver that relies on naming convention。关于配置FTW的惯例!