如何在单个类上禁用默认的Castle拦截器?

时间:2013-04-02 15:29:40

标签: c# castle-windsor interceptor castle

在我正在开发的应用程序上,我们正在使用Castle Windsor的一些AOP工具,主要用于记录方法入口/出口点以及调试/性能分析的时间。这样可以正常工作,因为我们在整个容器中使用默认拦截器,它将自身应用于所有内容,包括Logging类,因此日志最终会被消息阻塞,解释它是如何进入和退出日志写入方法的。

在其他类上,我可以使用自定义IInterceptorSelector以及类的Intercept属性来覆盖默认值,但查看Castle文档时我看不到任何等效的DoNotIntercept属性类型。我已经为我的日志类创建了一个NullInterceptorSelector,它返回一个空列表,但这似乎是一种疯狂的解决方法,我相信必须有更好的方法来做到这一点 - 任何人都可以建议如何?

编辑:拦截器列表也是累积的,所以我的NullInterceptorSelector实际上不起作用。

1 个答案:

答案 0 :(得分:1)

简单的解决方案显然是不使用拦截器连接设施......但如果由于某种原因无法实现,则可以使用您自己建议的InterceptorSelector。

IInterceptorSelector类的目的是提供一个扩展点,允许代理在每个方法的基础上选择特定的拦截器。

您的注册将如下所示:

container.Register(Component.For<IInterface>()
         .ImplementedBy<Component>()
         .Interceptors(InterceptorReference.ForType<LoggingInterceptor>()).SelectedWith(new ExampleInterceptionSelector()).Anywhere);

ExampleInterceptionSelector的准系统实现如下所示:

public class ExampleInterceptionSelector : IInterceptorSelector
{
    public IInterceptor[] SelectInterceptors(Type type, MethodInfo method, IInterceptor[] interceptors)
    {
        return new IInterceptor[];
    }
}

但更好的解决方案是不要将拦截器连接到不需要它们的组件。