Castle Windsor - 如何根据构造函数参数解析组件

时间:2010-08-20 13:59:19

标签: castle-windsor ioc-container

说我有这样的组件

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返回相同的对象。

谢谢!

1 个答案:

答案 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()(仅用于测试目的)。