0

同じタイプ (Foo -> IFoo) の 2 つのコンポーネントを作成するように Castle Windsor を構成したいと思いますが、コンストラクターの入力は異なります。また、後で別のコンポーネントを作成するときに両方のコンポーネントを使用したいと思います (タイプ Bar - 以下のコードを参照)。

public interface IFoo { }

public class Foo : IFoo
{
    private string _prop;

    public Foo(string prop)
    {
        _prop = prop;            
    }
}

public class Bar
{
    private IFoo _fooAbc;
    private IFoo _foo123;

    public Bar(IFoo fooAbc, IFoo foo123)
    {
        _foo123 = foo123;
        _fooAbc = fooAbc;
    }
}

コンポーネントインストーラーで、次のようなコンポーネントを登録しようとしました:

public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(Classes.FromThisAssembly()
                            .BasedOn<IFoo>().WithServiceBase()
                            .ConfigureFor<Foo>(c => c.DependsOn(Dependency.OnValue<string>("abc")).Named("fooAbc"))
                            .ConfigureFor<Foo>(c => c.DependsOn(Dependency.OnValue<string>("123")).Named("foo123")));

        container.Register(Component.For<Bar>());   //?? specify which service to use
    }

しかし、キャッスルは登録例外をスローします。では、Foo の 2 つのインスタンス (1 つは "abc"、もう 1 つは "123" 依存関係) を構成するにはどうすればよいでしょうか? また、後でBarを構築するときにそれらを正しく割り当てて、fooAbcが最初のコンストラクター入力として使用され、foo123が2番目として使用されるようにしたいと思います。私の最終目標は、バーをうまく解決することです。

4

1 に答える 1

1

これがあなたが求めているものに近いかどうかはわかりませんが、 ServiceOverride.ForKeyどのパラメーターがどの名前にマップされるかを指定するために使用できます。

Component.For<Bar>().ImplementedBy<Bar>().
    DependsOn(ServiceOverride.ForKey("fooAbc").Eq("abc")).
    DependsOn(ServiceOverride.ForKey("foo123").Eq("123"))
);

または、直接的な答えではありませんが、解決するオプションがありますIEnumerable<IFoo>IFooこれは、実際に解決する任意の数がある場合に適したオプションです。

Bar の定義を変更して、IEnumerable

public class Bar
{
    private readonly IEnumerable<IFoo> _foos;

    public Bar(IEnumerable<IFoo> foos)
    {
        _foos = foos;
    }
}

次に、登録して解決します。登録を行う前に、Resolve を追加する必要があります。

var container = new WindsorContainer();

container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel, true));

container.Register(
    Component.For<IFoo>().Instance(new Foo("abc")).Named("abc"),
    Component.For<IFoo>().Instance(new Foo("123")).Named("123"),
    Component.For<Bar>().ImplementedBy<Bar>());
于 2013-06-02T20:57:19.303 に答える