2009-01-07 4 views
5

Si j'ai enregistré plusieurs composants avec Windsor.Comment puis-je dire à Windsor d'ajouter un Interceptor à tous les composants enregistrés qui implémentent IMustBeIntercepted

IAnimal fournit BigAnimal IPerson fournit SmellyPerson IWhale fournit BlueWhale

etc .. assez composant standard registeration

tous les types ci-dessus mettent en œuvre IMustBeIntercepted, comment puis-je dire le récipient ajouter un intercepteur à tous les types qui implémentez IMustBeImplemented de sorte que lorsque Resolve est appelé, il renvoie un BigAnimal avec un intercepteur tel que défini car il correspond. Je sais que je peux le faire pour chacun d'eux, mais sa configuration XML supplémentaire ou config programatic que je veux éviter

Répondre

5

Il suffit de créer une interface comme ceci:

public interface IMustBeIntercepted {} 

et un centre comme celui-ci:

public class InterceptionFacility : AbstractFacility { 
    protected override void Init() { 
     Kernel.ComponentRegistered += new Castle.MicroKernel.ComponentDataDelegate(Kernel_ComponentRegistered); 
    } 

    void Kernel_ComponentRegistered(string key, Castle.MicroKernel.IHandler handler) { 
     if(typeof(IMustBeIntercepted).IsAssignableFrom(handler.ComponentModel.Implementation)) { 
      handler.ComponentModel.Interceptors.Add(new InterceptorReference(typeof(TestInterceptor))); 
     } 
    } 
} 

Enregistrez ensuite l'installation dans le conteneur à l'aide de l'étiquette <facility>. Maintenant tous les composants qui implémente IMustBeIntercepted seront interceptés par l'intercepteur TestInterceptor.

+0

Il fonctionne! Et .. ça m'a sauvé! – dtroy

2

Juste a écrit ce bébé:

public static BasedOnDescriptor WithInterceptor(this BasedOnDescriptor reg, string interceptorComponentName) { 
     return reg.Configure(x=> x.Configuration(
       Child.ForName("interceptors").Eq(
        Child.ForName("interceptor").Eq(
         "${" + interceptorComponentName + "}" 
       )))); 
    } 
Questions connexes