2010-03-04 8 views
0

je le cas d'utilisation suivante:Château-Windsor: Ecraser un composant à l'avenir

Je veux enregistrer tous les composants partagés entre toutes les configurations d'une application. Ensuite, je voudrais enregistrer une série de "plugins" configurés dynamiquement qui sont exprimés en implémentations personnalisées d'IRegistration.

Ensuite, je résous le point de départ de l'application. Une des choses que je voudrais faire un plugin est d'écraser une implémentation de service. Quelque chose comme ceci:

public class SomePlugin { 
    public void Register(IKernel kernel) { 
    kernel.RemoveComponent(typeof(DefaultServiceImplementation).FullName); 
    kernel.Register(
      Component.For<IService>() 
       .ImplementedBy<AlternateServiceImplementation>()) 
    } 
} 

Toutefois, cela ne fonctionne pas si l'un des composants ont déjà enregistré une dépendance à l'égard IService.

Je sais que je peux d'abord enregistrer les plugins, mais c'est limitatif pour plusieurs autres raisons. Comment puis-je répondre à mes exigences spécifiques?

La meilleure chose que je pouvais venir avec quelque chose comme

kernel.ResolvingComponent += (model, a, b) => { 
    if(model.Service == typeof(IService)) 
    model.Implementation = typeof(AlternateServiceImplementation); 
} 

Je pense que cela pourrait fonctionner dans certains scénarios limités mais il est loin d'être idéale.

+0

Donc, fondamentalement, vous voulez que le * dernier * composant enregistré soit le composant par défaut? –

+0

Bien sûr que ce serait une implémentation. Plus précisément, je suis intéressé à dire "Hey pour le composant X qui a été précédemment mis en œuvre par X1 commencer à utiliser X2 par défaut" –

+0

Je veux dire est-il * toujours * le dernier enregistré? Ou juste parfois? Cela vous dérangerait-il d'utiliser des attributs? –

Répondre

3

George,

Je crois que ce que vous cherchez est IHandlerSelector.

+0

Je pense que c'est. Merci mec –

Questions connexes