2010-11-19 109 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