How do I tell Windsor to add an Interceptor to all components registered that implement IMustBeIntercepted
如果我在 Windsor 注册了多个组件。
IAnimal 提供 BigAnimal
IPerson 提供 SmellyPerson
IWhale 提供 BlueWhale
etc.. 非常标准的组件注册
以上所有类型都实现了 IMustBeIntercepted,我如何告诉容器为所有实现 IMustBeImplemented 的类型添加一个拦截器,以便在调用 Resolve 时返回一个 BigAnimal,因为它匹配时定义了一个拦截器。我知道我可以为每一个都执行此操作,但我想避免其额外的 XML 配置或程序配置
像这样简单地创建一个界面:
1 | public interface IMustBeIntercepted {} |
还有这样的设施:
1 2 3 4 5 6 7 8 9 10 11 | 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))); } } } |
然后使用
拦截
刚刚写了这个宝贝:
1 2 3 4 5 6 7 | public static BasedOnDescriptor WithInterceptor(this BasedOnDescriptor reg, string interceptorComponentName) { return reg.Configure(x=> x.Configuration( Child.ForName("interceptors").Eq( Child.ForName("interceptor").Eq( "${" + interceptorComponentName +"}" )))); } |