gpt4 book ai didi

caSTLe-windsor - CaSTLe Windsor - 如何根据构造函数参数解析组件

转载 作者:行者123 更新时间:2023-12-04 04:08:24 27 4
gpt4 key购买 nike

假设我有这样的组件

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 实例化,然后为所有 future 的 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);

而不是在我的代码中使用 Resolve() (这纯粹是为了测试目的),您通常使用服务覆盖或处理程序选择器来选择将哪个 MyComponent 注入(inject)到您的其他服务中。

关于caSTLe-windsor - CaSTLe Windsor - 如何根据构造函数参数解析组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3531552/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com