如果我在Windsor注册了几个组件.
IAnimal提供了BigAnimal IPerson提供的SmellyPerson IWhale提供了BlueWhale
等等.相当标准的组件注册
以上所有类型都实现了IMustBeIntercepted,如何告诉容器向所有实现IMustBeImplemented的类型添加一个拦截器,以便在调用Resolve时返回一个BigAnimal,其拦截器定义为匹配.我知道我可以为每个人做这个,但是我想避免使用额外的XML配置或编程配置
只需创建一个这样的界面:
public interface IMustBeIntercepted {}
Run Code Online (Sandbox Code Playgroud)
和这样的设施:
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)));
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用<facility>标记将设施注册到容器.现在所有实现的组件都IMustBeIntercepted将被拦截器截获TestInterceptor.