If I registered several components with Windsor.
IAnimal provides BigAnimal IPerson provides SmellyPerson IWhale provides BlueWhale
etc.. pretty standard component registeration
all the above types implement IMustBeIntercepted, how do I tell the container add an interceptor to all types that implement IMustBeImplemented so that when Resolve is called it is returned a BigAnimal with an interceptor as defined since it matches. I know I can do this for each one but its extra XML config or programatic config which I want to avoid
-
Simply create an interface like this:
public interface IMustBeIntercepted {}
and a facility like this:
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))); } } }
Then register the facility to the container using the
<facility>
tag. Now all components that implementsIMustBeIntercepted
will be intercepted by the interceptorTestInterceptor
. -
Just wrote this baby:
public static BasedOnDescriptor WithInterceptor(this BasedOnDescriptor reg, string interceptorComponentName) { return reg.Configure(x=> x.Configuration( Child.ForName("interceptors").Eq( Child.ForName("interceptor").Eq( "${" + interceptorComponentName + "}" )))); }
0 comments:
Post a Comment