2010-08-20 21 views
6

bunu çözümlerken Temelde sağlanan yapıcı parametreleri istiyorum buWindsor Castle - yapıcı parametrelere dayalı bileşenleri nasıl çözüleceği

public class MyComponent 
{ 
    public MyComponent(string name) 
    { 
    } 
} 

gibi bir bileşen bileşeni kimliğinin bir parçası olarak davranırlar olduğunu varsayalım. Eğer bu parametreleri bir dizi ile çözmediyseniz, yeni bir tane oluşturacaktır. Bir, daha sonra gelecekteki tüm name = a için aynı nesneyi döndürmek = adıyla örneğini ve çünkü Halen başarısız

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); 

: Başka bir deyişle

, ben başarılı olmak için her nasılsa aşağıdaki testi değiştirmek istediğiniz = b adı.

Teşekkürler!

+1

** emin misiniz? ** bunu kayıt süresi yerine çözünürlük zamanında yapmak ister misiniz? –

cevap

6

Normalde bu, kayıt süresinde değil, çözünürlük zamanında yapılır. Aslında, kablonuzu Resolve() yöntemini çağırmak, kapsayıcıyı bir hizmet konumlandırıcı olarak kullandığınız için çok az olmalıdır. Bunun yerine normal hizmet geçersiz kılmaları veya diğer hizmetler içine enjekte etmek MyComponent seçmek için bir işleyici seçiciyi kullanabilirsiniz (test amaçlı tamamen olan) benim kodda olduğu gibi Çöz() kullanmanın

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); 

.

+0

Bunu yapabileceğimin farkındayım, ama aslında otomatik fabrika tesisini kullanıyorum. Varsayılan olarak, Get bileşen (bileşen adı) yöntemleriyle bileşenleri seçebilirsiniz, ancak benim için dinamik olması gerekir. Ancak, Get (bileşen adı) yöntemini veya benzer bir şeyi gerçekleştirmeme izin veren bir seçici yazmak mümkün görünüyor. – Cameron

+0

@Cameron: Sorununuzla ilgili tüm ayrıntıları ve ilgili bir test durumunu belirten başka bir soru oluşturmanızı öneririz. Bu yoruma kadar yazılan fabrika tesisinden söz edilmemiştir. –

+0

Ben asıl soruda tarif ettiğim şeyin mümkün olup olmadığını bilmek isterdim. Kaynak kodunu okuduktan sonra fabrika destek tesisinin alt kapta ne yaptığını biliyorum, bu yüzden kabın kendisinin anlattığım şeye benzer bir şey destekleyip desteklemediğini öğrenmek istedim. Eğer değilse, sorun değil, ben de başka bir şekilde uygulayacağım. – Cameron

İlgili konular