在我正在开发的应用程序上,我们正在使用Castle Windsor的一些AOP工具,主要用于记录方法入口/出口点以及调试/性能分析的时间。这样可以正常工作,因为我们在整个容器中使用默认拦截器,它将自身应用于所有内容,包括Logging类,因此日志最终会被消息阻塞,解释它是如何进入和退出日志写入方法的。
在其他类上,我可以使用自定义IInterceptorSelector以及类的Intercept
属性来覆盖默认值,但查看Castle文档时我看不到任何等效的DoNotIntercept
属性类型。我已经为我的日志类创建了一个NullInterceptorSelector,它返回一个空列表,但这似乎是一种疯狂的解决方法,我相信必须有更好的方法来做到这一点 - 任何人都可以建议如何?
编辑:拦截器列表也是累积的,所以我的NullInterceptorSelector实际上不起作用。
答案 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[];
}
}
但更好的解决方案是不要将拦截器连接到不需要它们的组件。