2010-11-19 113 views
0

我有以下测试代码尝试获取一个实例的通用和其他特殊用途。Castle Windsor解析命名实例和未命名实例不正确

[TestMethod] 
public void Test_Name_And_Named_Instances() 
{ 
//MyClass implemented IMyClass 
MyClass genericInstance = new MyClass("generic"); 
MyClass specialInstance = new MyClass("special"); 

IWindsorContainer container = new WindsorContainer(); 
container.Register(Component.For(IMyClass).Instance(genericInstance)); 
container.Register(Component.For(IMyClass).Instance(specialInstance).Named("special")); 

IMyClass genericOne = container.Resolve<IMyClass>(); 
IMyClass specialOne = container.Resolve<IMyClass>("special"); 

Assert.AreSame(genericOne, genericInstance); //true 
Assert.AreNotSame(genericOne, specialOne); //false 
} 

我希望得到两个不同的实例,但结果是既genericOne和specialOne指向同一objec genericInstance。

有什么想法?

回答

1

这并不编译:

container.Register(Component.For(IMyClass).Instance(genericInstance)); 

应该是:

container.Register(Component.For<IMyClass>().Instance(genericInstance)); 

除此之外,the test passes for me(温莎2.5.2)

编辑:

如果您翻转注册,测试失败。这是设计。当你没有明确的名字解析时,你会说“给我这个服务的默认组件”,默认情况下,Windsor是该服务类型的第一个注册组件。

如果您需要相同服务类型下的不同组件,请在注册和解析时为其分配明确的名称。

+0

我的错误。发布的代码与实际测试代码几乎没有什么不同。 (Component.For(IMyClass).Instance(genericInstance)); 应该是 container.Register(Component.For(typeof(IMyClass))。Instance(genericInstance)); IMyClass specialOne = container.Resolve (“special”); is IMyClass specialOne = container.Resolve(typeof(IMyClass),“special”); 我发现最后解决导致我的问题。它应该是 IMyClass specialOne = container.Resolve(“special”,typeof(IMyClass)); 编译器不给我错误。 对不起,打扰你们所有人。 – Tao 2010-11-19 21:22:03

+0

我需要开枪自杀。原始的测试工作。现在我改变了注册顺序。先注册指定类型然后注册未命名类型。它再次给了我同样的例子。但是如果我改变订单,那么它就可以工作。新变化: container.Register(Component.For(typeof(IMyClass))。Instance(specialInstance).Named(“special”)); (Component.For(typeof(IMyClass))。Instance(genericInstance)); – Tao 2010-11-19 22:21:24

+0

@陶:这种行为是由设计,看到我更新的答案。 – 2010-11-20 02:24:38