如何告诉Windsor将Interceptor添加到已注册实现IMustBeIntercepted的所有组件

5 castle-windsor

如果我在Windsor注册了几个组件.

IAnimal提供了BigAnimal IPerson提供的SmellyPerson IWhale提供了BlueWhale

等等.相当标准的组件注册

以上所有类型都实现了IMustBeIntercepted,如何告诉容器向所有实现IMustBeImplemented的类型添加一个拦截器,以便在调用Resolve时返回一个BigAnimal,其拦截器定义为匹配.我知道我可以为每个人做这个,但是我想避免使用额外的XML配置或编程配置

Mik*_*erg 5

只需创建一个这样的界面:

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.