2011-08-18 1 views
6

Je peux imaginer que cela pourrait être assez simple à faire à Castle mais je suis nouveau à la technologie et ai été Google pendant des heures sans chance!Comment instancier un composant en tant que Singleton lors de l'enregistrement?

Je donne les résultats suivants:

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

maintenant tout à fait à juste titre cela est chargé paresseux, à savoir l'expression lambda passé pour UsingFactoryMethod() ne sont pas en cours d'exécution jusqu'à ce que je demande en fait le château de me résoudre la instance de la classe.

Mais je voudrais que Castle crée l'instance dès que je l'ai enregistrée. Est-ce possible?

Répondre

8

Vous pouvez simplement utiliser le construit il installation amorçable comme ceci:

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

Vous pouvez lire à ce sujet here

7

Pour ce simple cas vous pouvez simplement register an existing instance:

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

Merci! Voici ce que j'ai fini par utiliser - container.Register (Component.For (). Instance (new MySpecialClass())); – jameskind

+1

Cela ne semble pas être la meilleure approche puisque vous ne quittez pas l'instanciation vers le conteneur et que vous ne respectez pas le schéma IoC. –

+0

@DavidPerlman À l'époque où j'ai écrit cette réponse, je pense que la réponse de MosheLevi n'était pas si simple. –

1

La réponse re en utilisant « instance » peut ne pas être toujours possible (si la classe a des couches de dépendances lui-même, il ne sera pas facile à nouveau vers le haut). Dans ce cas, au moins à Windsor 2.5, vous pouvez utiliser ceci:

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