![](/img/trans.png)
[英]In Castle Windsor, how to register ONE of many implementations of generic interface for ALL found implementations of generic type?
[英]Castle Windsor: How do I inject all implementations of interface into a ctor?
我编写了一个由多个类实现的接口。 我想编写一个Service类,它将所有注册的实现注入其ctor中。
我能想到的唯一解决方案是在ctor中调用Service Locator,并要求它对所有实现进行Resolve()。
理想情况下,我想要这样的东西-
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<IVehicle> vehicles)
{
foreach (var vehicle in vehicles)
{
vehicle.Start();
}
}
}
编辑 -我应该提到我正在使用温莎城堡。
您必须使用CollectionResolver
。 查看此温莎城堡常见问题解答 :
温莎默认情况下,当您依赖IFoo [],IEnumerable或IList时,将检查您是否为该确切类型注册了组件(IFoo的数组或列表),而不是是否为IFoo注册了任何组件(组件的数组,与作为数组的组件不同)。 您可以将行为更改为“当您看到IFoo的数组或列表时,只要给我我可以得到的所有IFoo”,就可以使用CollectionResolver。
直接链接到Castle Resolvers: Resolvers 。
我知道已经回答了这个问题,但是我认为一个有关如何添加CollectionResolver的示例会很有用,所以就在这里。
在容器中注册组件之前,请调用AddSubResolver
container = new WindsorContainer();
container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel));
正常注册组件:
container.Register(
Component.For<IVehicle>().ImplementedBy<Car>(),
Component.For<IVehicle>().ImplementedBy<Truck>(),
Component.For<IVehicle>().ImplementedBy<Motorbike>()
);
发现这个答案很有用,尽管我仍然缺少如何注册给定接口的所有实现。
希望这可以帮助!
container.Register(
Classes.FromAssemblyContaining<IVehicle>()
.BasedOn<IVehicle>().WithService.FromInterface()
);
答案都是正确的,但我只是想给它增加一点点皱纹: 在注册组件之前,必须添加子解析器。
这将起作用:
container = new WindsorContainer();
container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel));
container.Register(
Component.For<IVehicle>().ImplementedBy<Car>(),
Component.For<IVehicle>().ImplementedBy<Truck>(),
Component.For<IVehicle>().ImplementedBy<Motorbike>()
);
这是不行的
container = new WindsorContainer();
container.Register(
Component.For<IVehicle>().ImplementedBy<Car>(),
Component.For<IVehicle>().ImplementedBy<Truck>(),
Component.For<IVehicle>().ImplementedBy<Motorbike>()
);
container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.