【问题标题】:How do I disable the default Castle interceptor on a single class?如何禁用单个类的默认 Castle 拦截器?
【发布时间】:2014-06-19 00:03:05
【问题描述】:

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

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

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

【问题讨论】:

  • 你是怎么注册的?
  • 我猜你的注册约定太宽泛了,你能发布一些注册码吗?

标签: c# castle-windsor interceptor castle


【解决方案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[];
    }
}

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

【讨论】:

    猜你喜欢
    • 2013-10-22
    • 2011-08-04
    • 2014-11-24
    • 2022-09-23
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 2012-03-31
    相关资源
    最近更新 更多