Cam*_*ron 9 castle-windsor ioc-container
说我有这样的组件
public class MyComponent
{
public MyComponent(string name)
{
}
}
Run Code Online (Sandbox Code Playgroud)
我基本上希望在解析它时提供的构造函数参数作为组件标识符的一部分.如果您从未使用该组参数解决它,它将实例化一个新参数.
换句话说,我想以某种方式修改以下测试以成功:
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);
Run Code Online (Sandbox Code Playgroud)
目前它失败了,因为它将使用name = a进行实例化,然后为所有将来的name = 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);
Run Code Online (Sandbox Code Playgroud)
您可以使用服务覆盖或处理程序选择器来选择将哪个MyComponent注入到其他服务中,而不是像我的代码中那样使用Resolve()(纯粹用于测试目的).
| 归档时间: |
|
| 查看次数: |
8888 次 |
| 最近记录: |