说我有这样的组件
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);
目前它失败了,因为它将使用name = a进行实例化,然后为所有将来的name = a和name = b返回相同的对象。
谢谢!
答案 0 :(得分:8)
通常这是在注册时完成的,而不是在解决时间。事实上,在您的代码中调用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);
您可以使用服务覆盖或处理程序选择器来选择将哪个MyComponent注入到其他服务中,而不是像我的代码中那样使用Resolve()(仅用于测试目的)。