2010-11-19 20 views
0

Genel ve başka bir amaç için bir örnek almaya çalışırken aşağıdaki kodları takip ediyorum.Castle Windsor, adlandırılmış örneği ve adlandırılmamış örneği hatalı

[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 
} 

İki farklı örneklerini almak için bekliyoruz, ancak sonuç aynı hedeflere genericInstance hem genericOne ve specialOne puandır.

Herhangi bir fikrin var mı?

cevap

1

Bu derleme değil:

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

olmalı:

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

Diğer, the test passes for me (Windsor 2.5.2)

DÜZENLEME:

Eğer kayıtları ters çevir, test başarısız. Bu tasarım gereğidir. Açık bir ad olmadan çözdüğünüzde, "bu hizmet için varsayılan bileşeni ver" yazıyorsunuz. Bu, Windsor'un varsayılan olarak bu hizmet türü için ilk kayıtlı bileşenidir.

Aynı hizmet tipi altında farklı bileşenlere ihtiyacınız varsa, kayıt ve çözümlerken hepsine açık adlar atayın.

+0

Benim hatam. Gönderilen kod, gerçek test kodundan biraz değişmişti. container.Register (Component.For (IMyClass) .Instance (genericInstance)); , container olmalıdır. (Bileşen (Form) (type (IMyClass)). Örnek (genericInstance)); IMyClass specialOne = container.Resolve ("özel"); , IMyClass specialOne = container.Resolve (typeof (IMyClass), "special"); Son Resolve'un bana sorun yarattığını buldum. IMyClass specialOne = container olmalıdır. Çözünür ("özel", typeof (IMyClass)); Derleyici bana hata vermiyor. Hepinizi rahatsız ettiğim için özür dilerim. – Tao

+0

Kendime ateş etmem gerekiyor. Orijinal test çalışması. Şimdi kayıt sırasını değiştirdikten sonra. Önce adlandırılmış türü kaydedin ve adsız olarak yazın. Bana yine aynı örneği veriyor. Ama eğer siparişi değiştirirsem, o zaman çalışır. Yeni değişiklik: container.Register (Component.For (typeof (IMyClass)) Örnek (özel Örnek). Ad ("özel")); container.Register (Component.For (typeof (IMyClass)). Örnek (genericInstance)); – Tao

+0

@Tao: Bu davranış tasarım gereğidir, güncellenmiş yanıtıma bakın. –