2011-08-18 4 views
6

Posso immaginare che questo potrebbe essere abbastanza semplice da fare a Castle, ma sono nuovo della tecnologia e sono stato su Google per ore senza fortuna!Come si istanzia il componente come Singleton al momento della registrazione?

Ho il seguente:

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

Ora giustamente questa è di essere pigro-caricato, vale a dire l'espressione lambda passata a UsingFactoryMethod() non è in esecuzione fino a quando ho effettivamente chiedo Castello per risolvere i me il istanza della classe.

Ma vorrei che Castle crei l'istanza non appena l'ho registrata. È possibile?

risposta

8

si può semplicemente utilizzare il costruito impianto avviabile in questo modo:

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

Si può leggere su di esso here

7

Per questo semplice caso si può solo register an existing instance:

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

Grazie! Ecco cosa ho finito usando - container.Register (Component.For (). Instance (new MySpecialClass())); – jameskind

+1

Questo non sembra l'approccio migliore poiché non si lascia l'istanziazione al contenitore e quindi si interrompe il modello IoC. –

+0

@DavidPerlman Giusto, quando ho scritto questa risposta, penso che non ci fosse un modo così semplice come la recente risposta di MosheLevi descrive. –

1

La risposta sta utilizzando "Istanza" potrebbe non essere sempre fattibile (se la classe ha strati di dipendenze si, non sarà facile nuova in alto). In questo caso, almeno in Windsor 2.5, è possibile utilizzare questo:

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