Castle Windsor:获取特定界面的已注册组件的所有名称

时间:2012-05-09 20:00:27

标签: castle-windsor factory

我编写了一个新的FactoryComponentSelector,它能够通过名称解析特定接口的实例。到现在为止还挺好。但是,当涉及到我们应用程序的业务部分中的配置时,我需要一个容器外的给定接口的所有名称的列表。

假设我们有以下注册:

container.AddFacility<TypedFactoryFacility>();

container.Register(Component.For<ITypedFactoryComponentSelector>().ImplementedBy<CreateByNameComponentSelector>());
container.Register(Component.For<IProviderFactory>().AsFactory(c => c.SelectedWith<CreateByNameComponentSelector>()));

container.Register(Component.For<IProvider>().ImplementedBy<FirstProvider>().Named("First"));
container.Register(Component.For<IProvider>().ImplementedBy<SecondProvider>().Named("Second"));
container.Register(Component.For<IProvider>().ImplementedBy<ThirdProvider>().Named("Third"));

有没有办法向容器询问实现接口IProvider的所有已注册组件的名称列表?

2 个答案:

答案 0 :(得分:7)

var handlers = container.Kernel.GetHandlers(typeof(IProvider));

handlers.Select(h=>h.ComponentModel.Name);

答案 1 :(得分:0)

IEnumerable<IProvider> providers = container.ResolveAll<IProvider>();

一句话 - 正如温莎docs所说:

  

“当您使用Resolve时,请注意它与Resolve有一些不同的语义。它将返回所有可分配给指定类型的可解析组件,而不仅仅是那些将类型注册为其服务之一的组件。”< / p>