如何告诉 Windsor 向所有注册的实现 IMustBeIntercepted 的组件添加拦截器

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

然后使用 <facility> 标签将设施注册到容器中。现在所有实现 IMustBeIntercepted 的组件都会被拦截器 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 +"}"
                ))));
    }