2010-07-23 1 views
2

Dans Castle Windsor, lors de l'enregistrement d'instances avec un cycle de vie singleton, existe-t-il un moyen de les instancier avec empressement (plutôt que de les initialiser la première fois qu'elles sont injectées)?Puis-je instancier avec instance des instances enregistrées en tant que singletons en utilisant Castle Windsor?

Mise à jour:

Je me suis un peu plus de détails seraient utiles ici:

  1. Ces instances contiennent un code d'initialisation qui serait avantageux d'exécuter au démarrage, c'est pourquoi je suis intéressé En faisant cela.
  2. Je suis en train d'enregistrer un certain nombre de ces instances en utilisant AllTypes.Pick(), donc je préférerais une solution qui ne m'implique pas de résoudre manuellement chaque instance du conteneur séparément après que je l'ai construit.

Répondre

4

Oui, vous pouvez utiliser Facility amorçable (qui sort de la boîte avec Windsor):

container.AddFacility<StartableFacility>(
// optionally in v2.5 
f=> f.DeferredStart() 
); 
container.Register(
    AllTypes.FromThisAssembly() 
     .Pick().WhateverYouWant() 
     .Configure(c => c.Start()); 

DeferredStart méthode est nouvelle dans v2.5 et you can see here ce qu'il fait et pourquoi il est conseillé de utilise le. Les exemples utilisent une partie de la nouvelle API dans la version 2.5, mais si vous utilisez la version 2.1, cela devrait vous donner une idée de la manière d'y parvenir.

Dans les versions précédentes méthode Start() est appelée Startable()

+0

Merci! Ceci est exactement ce que je cherchais. – DanP

+0

Une autre question ... ma logique "start" est appelée dans le constructeur pour le composant; alors comment puis-je obtenir ce travail en utilisant cette méthode? – DanP

+1

Utilisez la méthode 'Start', il suffit d'instancier l'objet. Si vous avez une méthode avec une logique démarrable sur votre composant utilisez 'StartUsingMethod (c => c.YourStartMethod)' En d'autres termes - l'exemple que j'ai montré fait exactement ce que vous voulez. –

Questions connexes