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

本文关键字:城堡 默认 单个类 | 更新日期: 2023-09-27 18:07:16

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

在其他类上,我能够使用自定义IInterceptorSelector以及类上的Intercept属性来覆盖默认值,但是通过城堡文档,我看不到任何等效的DoNotIntercept类型的属性。我已经创建了一个NullInterceptorSelector为我的日志类返回一个空列表,但这似乎是一种疯狂的变通方法,我相信一定有一个更好的方法来做到这一点-谁能建议如何?

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

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

简单的解决方案显然是不使用拦截器连接设施…但如果由于某些原因无法实现,你可以像你自己建议的那样使用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[];
    }
}

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