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