2009-01-07 10 views
5

Si registré varios componentes con Windsor.Cómo le pido a Windsor que agregue un Interceptor a todos los componentes registrados que implementen IMustBeIntercepted

IAnimal ofrece BigAnimal IPerson ofrece SmellyPerson iWhale ofrece BlueWhale

etc .. bastante estándar componente registeration

todos los tipos anteriores implementan IMustBeIntercepted, ¿cómo le digo el contenedor añadir un interceptor de todo tipo que implemente IMustBeImplemented para que cuando se llame a Resolve se devuelva un BigAnimal con un interceptor como se define, ya que coincide. Sé que puedo hacer esto para cada uno, pero su exceso de configuración XML o configuración programática, que quiero evitar

Respuesta

5

Basta con crear una interfaz de esta manera:

public interface IMustBeIntercepted {} 

y una instalación como esta:

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))); 
     } 
    } 
} 

A continuación, registre la instalación en el contenedor utilizando la etiqueta <facility>. Ahora todos los componentes que implementa IMustBeIntercepted serán interceptados por el interceptor TestInterceptor.

+0

Funciona! Y ... ¡me salvó! – dtroy

2

acabo de escribir este bebé:

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