【问题标题】:Castle Windsor - how to resolve components based on constructor parametersCastle Windsor - 如何根据构造函数参数解析组件
【发布时间】:2011-04-01 16:28:43
【问题描述】:

假设我有一个这样的组件

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

谢谢!

【问题讨论】:

  • 确定要在解决时而不是注册时执行此操作吗?

标签: castle-windsor ioc-container


【解决方案1】:

这通常在注册时完成,而不是在解决时完成。事实上,在您的代码中调用 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()(这纯粹是为了测试目的)。

【讨论】:

  • 我知道我可以做到这一点,但我实际上正在使用类型化的自动工厂工具。默认情况下,您可以使用 Get{component-name} 方法选择组件,但对我来说它需要是动态的。但是,看起来可以编写一个选择器,让我实现 Get(component-name) 方法或类似的方法。
  • @Cameron:我建议创建另一个问题,说明有关您的问题的所有相关详细信息以及相关的测试用例。在此评论之前没有提及类型化工厂设施。
  • 我确实想知道我在原始问题中描述的内容是否可行。当我阅读了源代码时,我知道工厂支持设施对下面的容器做了什么,所以我只想知道容器本身是否支持类似于我描述的东西。如果不是,那没关系,我会以另一种方式实现。
  • @cameron:我再次建议您针对您的实际问题创建一个问题,而不是类似的问题。可能有更好的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多