2011-08-18 31 views
6

Bunun Kale'de yapılması oldukça kolay olabileceğini hayal edebiliyorum, ancak teknolojiye yeniyim ve şanssız saatlerce Googling oldum!Bileşeni, kayıt sırasında Singleton olarak nasıl uygularım?

aşağıdakileri sorunum:

container.Register(
Component.For<MySpecialClass>().UsingFactoryMethod(
    () => new MySpecialClass()).LifeStyle.Singleton); 

Aslında kale sorana kadar Şimdi çok haklı olarak bu tembel yüklenmiş, değil yürütülmekte olan UsingFactoryMethod() için geçirilen lambda ifadesi yani bana olmanın Çöz etmektir sınıfın örneği.

Ancak Castle, kayıt yaptırdığım anda örneği oluşturmasını isterim. Mümkün mü? yapabildin bu basit durum için

cevap

8

Sadece çok gibi inşa o başlatılabilir tesis kullanabilirsiniz:

container.AddFacility<StartableFacility>(); 
container.Register(Component.For<MySpecialClass>().LifeStyle.Singleton.Start()); 

Sen here

bu konuda bilgi edinebilir
7

sadece register an existing instance:

var special = new MySpecialClass(); 
container.Register(Component.For<MySpecialClass>().Instance(special)); 
+0

Teşekkürler! İşte kullanarak sona erdi - container.Register (Component.For (). Örnek (yeni MySpecialClass())); – jameskind

+1

Bu, en iyi yaklaşım gibi görünmüyor, çünkü kapsayıcıyı kapsayıcıya bırakmıyorsunuz ve dolayısıyla IoC desenini kırıyorsunuz. –

+0

@DavidPerlman Doğru, bu cevabı yazdığım zaman, MosheLevi'nin son cevabı tarif ettiği kadar kolay bir yol olmadığını düşünüyorum. –

1

daima sınıf bağımlılıkları kendisi katmanları varsa (mümkün olmayabilir "Örnek" kullanılarak yeniden cevabı, yeni kolay olmayacak Bu kadar). Bu durumda, Windsor 2.5 en az, bu kullanabilirsiniz:

public static void ForceCreationOfSingletons(this IWindsorContainer container) 
    { 
     var singletons = 
      container.Kernel.GetAssignableHandlers(typeof (object)) 
        .Where(h => h.ComponentModel.LifestyleType == LifestyleType.Singleton); 

     foreach (var handler in singletons) 
     { 
      container.Resolve(handler.ComponentModel.Service); 
     } 
    } 

    // usage container.ForceCreationOfSingletons(); 
İlgili konular