Castle Windsor:如何将所有接口实现注入ctor?

我编写了一个由多个类实现的接口。 我想写一个Service类,它将所有注册的实现注入到它的ctor中。

我能想到的唯一解决方案是在ctor中调用服务定位器并要求它解决()所有实现。

理想情况下,我想要这样的东西 –

interface IVehicle { void Start(); } class Car : IVehicle { public void Start() { Console.WriteLine("Car started."); } } class Truck : IVehicle { public void Start() { Console.WriteLine("Truck started."); } } class Motorbike : IVehicle { public void Start() { Console.WriteLine("Motorbike started."); } } class VehicleService { // How do I inject all implementations of IVehicle? public VehicleService(IEnumerable vehicles) { foreach (var vehicle in vehicles) { vehicle.Start(); } } } 

编辑 – 我应该提到我正在使用Castle Windsor。

你必须使用CollectionResolver 。 查看Castle Windsor常见问题解答 :

Windsor,默认情况下,当你依赖于IFoo []时,IEnumerable或IList会检查你是否有一个注册了那个确切类型的组件(IFoo的数组或列表),如果你有任何为IFoo注册的组件(组件数组,与作为数组的组件不同。 您可以将行为更改为“当您看到IFoo的数组或列表时,只需向我提供所有IFoos”即可使用CollectionResolver。

直接链接到Castle Resolvers: Resolvers 。

我知道这已经得到了解答,但我认为如何添加CollectionResolver的示例将非常有用,所以现在就是这样。

在注册容器中的组件之前调用AddSubResolver,例如

 container = new WindsorContainer(); container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel)); 

正常注册组件:

 container.Register( Component.For().ImplementedBy(), Component.For().ImplementedBy(), Component.For().ImplementedBy() ); 

发现这个答案很有用虽然我仍然缺少如何注册给定接口的所有实现。

希望这可以帮助!

 container.Register( Classes.FromAssemblyContaining() .BasedOn().WithService.FromInterface() ); 

这里的答案都是正确的,但我只想为它添加一些额外的皱纹:你必须注册组件之前添加子解析器。

这将有效:

 container = new WindsorContainer(); container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel)); container.Register( Component.For().ImplementedBy(), Component.For().ImplementedBy(), Component.For().ImplementedBy() ); 

这不起作用

 container = new WindsorContainer(); container.Register( Component.For().ImplementedBy(), Component.For().ImplementedBy(), Component.For().ImplementedBy() ); container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel));