27

複数のクラスで実装されるインターフェースを作成しました。登録されているすべての実装がctorに注入されるServiceクラスを作成したいと思います。

私が考えることができる唯一の解決策は、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();
        }
    }
}

編集-私はCastleWindsorを使用していることに言及する必要があります。

4

4 に答える 4

32

を使用する必要がありますCollectionResolver。このCastleWindsorFAQを確認してください:

Windsorは、デフォルトでIFoo []に依存している場合、IEnumerableまたはIListは、IFoo(コンポーネントの配列、配列であるコンポーネントと同じではありません)。動作を変更して、「IFooの配列またはリストが表示されたら、取得できるすべてのIFooを取得してください」と言うように変更できます。CollectionResolverを使用します。

Castle Resolvers: Resolversへの直接リンク。

于 2012-05-04T16:00:42.370 に答える
30

これはすでに回答済みですが、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>()
);
于 2015-03-14T22:01:58.810 に答える
20

特定のインターフェイスのすべての実装を登録する方法がまだ不足していましたが、この回答は役に立ちました。

お役に立てれば!

container.Register(
            Classes.FromAssemblyContaining<IVehicle>()
                .BasedOn<IVehicle>().WithService.FromInterface()
            );
于 2015-12-16T17:30:20.897 に答える
3

ここでの答えはすべて正しいですが、少し余分なしわを追加したかっただけです。コンポーネントを登録する前に、サブリゾルバーを追加する必要があります。

これは機能します:

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));
于 2016-09-27T14:26:27.517 に答える