2010-03-22 3 views
2

Est-il possible d'effectuer un traitement personnalisé lorsque Windsor instancie un type?Castle Windsor: traitement personnalisé lors du démarrage du service

Quelque chose de similaire à:

 container.Register(
        AllTypes.Pick() 
         .FromAssembly(Assembly.GetExecutingAssembly()) 
         .BasedOn<MyMarkerInterface>() 
         .WhenInstantiating(instance => // do some stuff with this instance) 
         .Configure(component => component.Startable().LifeStyle.Singleton) 
         .WithService.Base()); 

Actuellement nous utilisons IStartable. Puisque le code "Start" (c'est-à-dire le traitement personnalisé) est identique, il serait bien de déplacer cette logique hors de chaque classe.

Merci! Brian

Répondre

5

Vous voulez dire quelque chose comme OnCreate méthode? Singleton est le style de vie par défaut, donc vous n'avez pas à le dire explicitement.

Notez cependant que le comportement est légèrement différent ici, par rapport à la façon dont fonctionne l'installation de démarrage. Lorsque le composant est démarrable, il est instancié et lancé par le conteneur lui-même, dès que possible (lorsque toutes ses dépendances requises sont disponibles).

  • OnCreate est appelée avant que votre composant ne soit renvoyé à partir du conteneur, mais il ne le crée pas de manière proactive. Donc si ne tire jamais ce composant, son OnCreate ne sera pas appelé. De plus, alors que les docs indiquent que OnCreate vit dans une installation, ce n'est plus vrai (ouais, nous devons mettre à jour les docs). Cette méthode fonctionnera hors de la boîte.

  • +0

    +1, mais la solution agnostique de conteneur est un décorateur :) –

    +1

    Je ne suis pas sûr du décorateur. Où mettriez-vous la logique? En .ctor? Que faire si vous voulez l'exécuter une fois que votre composant est entièrement instancié, c'est-à-dire avec des propriétés câblées également? Appelez-le paresseusement lors du premier appel à une méthode? Pas sûr que ce soit une si bonne idée. –

    +0

    Merci Krysztof. Pour les autres lecteurs, la méthode OnCreate a été ajoutée dans la version 2.1.0. –