Замок Виндзор - как разрешить компоненты на основе параметров конструктора - PullRequest
9 голосов
/ 20 августа 2010

Скажем, у меня есть такой компонент

public class MyComponent
{
    public MyComponent(string name)
    {
    }
}

В основном я хочу, чтобы при его разрешении предоставленные параметры конструктора работали как часть идентификатора компонента.Если вы никогда не разрешали его с этим набором параметров, он создаст новый экземпляр.

Другими словами, я хочу каким-то образом изменить следующий тест для успешного выполнения:

IWindsorContainer container = new WindsorContainer();
container.Register(Component.For<MyComponent>());
MyComponent a1 = container.Resolve<MyComponent>(new { name = "a" });
MyComponent a2 = container.Resolve<MyComponent>(new { name = "a" });
MyComponent b = container.Resolve<MyComponent>(new { name = "b" });

Assert.AreSame(a1, a2);
Assert.AreNotSame(a1, b);

В настоящее время происходит сбой, потому что он будет создан с именем = a, а затем вернет один и тот же объект для всех будущих имен = a и name = b.

Спасибо!

1 Ответ

8 голосов
/ 20 августа 2010

Обычно это делается во время регистрации, а не во время разрешения. На самом деле, вызов Resolve () в вашем коде должен быть редким, поскольку вы используете контейнер в качестве локатора службы.

container.Register(
   Component.For<MyComponent>()
            .Named("comp_a")
            .DependsOn(new { name = "a" }),
   Component.For<MyComponent>()
            .Named("comp_b")
            .DependsOn(new { name = "b" }));

var a1 = container.Resolve<MyComponent>("comp_a");
var a2 = container.Resolve<MyComponent>("comp_a");
var b = container.Resolve<MyComponent>("comp_b");
Assert.AreSame(a1, a2);
Assert.AreNotSame(a1, b);

Вместо использования Resolve (), как в моем коде (который предназначен исключительно для тестирования), вы обычно используете переопределения служб или селектор обработчика, чтобы выбрать, какой MyComponent будет внедряться в другие ваши службы.

...