3

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

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

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

4

1 回答 1

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[];
    }
}

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

于 2014-06-18T16:03:05.113 回答