Castle Windsor - как разрешать компоненты на основе параметров конструктора

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

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.

Спасибо!

9
задан Cameron 20 August 2010 в 13:59
поделиться

1 ответ

Обычно это делается во время регистрации, а не во время разрешения. Фактически, вызов 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 внедрять в другие службы.

8
ответ дан 4 December 2019 в 22:26
поделиться