繁体   English   中英

温莎城堡:我如何将接口的所有实现注入ctor?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM