2

Castle Windsor の解決方法に戸惑っています。このメソッドを使用すると、ほとんど何でも渡すことができます。resolve メソッドで送信された値は渡され、最終的に解決されるオブジェクトのコンストラクターで使用されますか? または、この値は、使用する具体的な実装をリゾルバーが決定するのを助けるために使用されますか?

たとえば、次のスニペットがあるとします...

var _container = new WindsorContainer();
_container.Install(FromAssembly.This());

var MyProcessor = _container.Resolve<IProcessor>(new Arguments(new {"Processor1"}));

Processor1:IProcessor や Processor2:IProcessor など、IProcessor の 2 つの具体的な実装があると仮定します。「引数」は何に使用されますか?

私は理解しています...

Component.For<IProcessor>() 

...定義する必要がありますが、Windsor の人々が使用する用語 (つまり、DependsOn、または ServicesOverrides) とその意図に苦労しています。メソッドが「解決」と呼ばれている場合、これに渡された値は、使用する具体的な実装の決定を解決するために使用されることしか想像できません。この仮定は間違っていますか?

4

3 に答える 3

4

あなたが話している引数パラメーターは、Windsor コンポーネントでは満たすことができないコンポーネントに引数を提供するためのものです。匿名型のオーバーロードと辞書のオーバーオールは、すべてこの目的のためのものです。私は過去にこれを使用しましたが、クリスティアーノが言及したような貧弱なパターンにつながるため、お勧めしません...そして前回これを使用したときは、直接解決されるコンポーネントに対してのみ機能します。とにかく...これがどのように機能するかの例を次に示します。

[TestFixture]
public class Fixture
{
    [Test]
    public void Test()
    {
        IWindsorContainer container = new WindsorContainer();
        container.Register(Component.For<IFoo>().ImplementedBy<Foo>().LifeStyle.Is(LifestyleType.Transient));

        Assert.Throws<HandlerException>(() => container.Resolve<IFoo>());

        IFoo foo = container.Resolve<IFoo>(new {arg1 = "hello", arg2 = "world"});
        Assert.That(foo, Is.InstanceOf<Foo>());
        Assert.That(foo.ToString(), Is.EqualTo("hello world"));
    }
}

public interface IFoo
{

}

public class Foo : IFoo
{
    private readonly string _arg1;
    private readonly string _arg2;

    public Foo(string arg1, string arg2)
    {
        _arg1 = arg1;
        _arg2 = arg2;
    }

    public override string ToString()
    {
        return string.Format("{0} {1}", _arg1, _arg2);
    }
}
于 2013-08-05T21:35:35.113 に答える
0

実際、コンポジション ルートではなく、コード内で Resolve を呼び出すべきではありません。また、Resolve メソッドにパラメーターを指定する必要もありません。

カスタム解決戦略は、インストーラー、factory/ITypedFactoryComponentSelector、サブリゾルバーを通じて行う必要があります...これらのオプションの詳細については、ドキュメントを参照してください

ところで、「解決」パラメーターを使用して、解決するコンポーネントを(名前またはタイプで)特定し、それ自体の直接的な依存関係を特定できます。

于 2013-08-05T10:30:48.927 に答える