Dora.Interception[4]表达式拦截器注册如何疑问?

摘要:基于特性标注的拦截器注册方式仅限于将拦截器应用到自己定义的类型上,对于第三方提供的类型就无能为力了。对于Dora.Interception(github地址,觉得不错不妨给一颗星)来说,拦截器注册本质上建立拦截器与一个或者多个目标方法之间的
基于特性标注的拦截器注册方式仅限于将拦截器应用到自己定义的类型上,对于第三方提供的类型就无能为力了。对于Dora.Interception(github地址,觉得不错不妨给一颗星)来说,拦截器注册本质上建立拦截器与一个或者多个目标方法之间的映射,所以最笨的方式就是利用反射的方式得到表示目标方法的MethodInfo对象,并将它与对应的拦截器关联在一起。这种方式虽然能够解决问题,但是编程体验很差。本篇介绍的基于表达式的拦截器注册方式利用针对目标方法或者属性的调用表达式,以一种强类型的方式获取到目标方法,极大地改善了编程体验。(拙著《ASP.NET Core 6框架揭秘》6折优惠,首印送签名专属书签) 一、IInterceptorRegistry以表达式采用强类型的方式将指定类型的拦截器应用到目标方法上是借助如下这个IInterceptorRegistry接口完成的。IInterceptorRegistry接口提供了一个For<TInterceptor>方法以待注册的拦截器类型关联,参数arguments用来提供构建拦截器对象的参数。该方法会返回一个IInterceptorRegistry<TInterceptor>对象,它提供了一系列的方法帮助我们将指定的拦截器应用到指定目标类型(通过泛型参数类型TTarget表示)相应的方法上。 public interface IInterceptorRegistry { IInterceptorRegistry<TInterceptor> For<TInterceptor>(params object[] arguments); ... } public interface IInterceptorRegistry<TInterceptor> { IInterceptorRegistry<TInterceptor> ToAllMethods<TTarget>(int order); IInterceptorRegistry<TInterceptor> ToMethod<TTarget>(int order, Expression<Action<TTarget>> methodCall); IInterceptorRegistry<TInterceptor> ToMethod(int order, Type targetType, MethodInfo method); IInterceptorRegistry<TInterceptor> ToGetMethod<TTarget>(int order, Expression<Func<TTarget, object?>> propertyAccessor); IInterceptorRegistry<TInterceptor> ToSetMethod<TTarget>(int order, Expression<Func<TTarget, object?>> propertyAccessor); IInterceptorRegistry<TInterceptor> ToProperty<TTarget>(int order, Expression<Func<TTarget, object?>> propertyAccessor); }封装了IServiceCollection集合的InterceptionBuilder提供了一个RegisterInterceptors扩展方法,我们可以利用该方法定义的Action<IInterceptorRegistry>类型的参数来使用上述的这个IInterceptorRegistry接口。不论是IServiceCollection接口的BuildInterceptableServiceProvider扩展方法,还是IHostBuilder接口的UseInterception方法均提供了一个可选的Action<InterceptionBuilder>委托类型的参数。
阅读全文