当前位置: 首页 > news >正文

杭州做网站哪个公司好成全视频免费观看在线看2024年新年贺词

杭州做网站哪个公司好,成全视频免费观看在线看2024年新年贺词,网站开发有前途,phpcms v9网站建设基于特性标注的拦截器注册方式仅限于将拦截器应用到自己定义的类型上#xff0c;对于第三方提供的类型就无能为力了。对于Dora.Interception来说#xff0c;拦截器注册本质上建立拦截器与一个或者多个目标方法之间的映射#xff0c;所以最笨的方式就是利用反射的方式得到表示…基于特性标注的拦截器注册方式仅限于将拦截器应用到自己定义的类型上对于第三方提供的类型就无能为力了。对于Dora.Interception来说拦截器注册本质上建立拦截器与一个或者多个目标方法之间的映射所以最笨的方式就是利用反射的方式得到表示目标方法的MethodInfo对象并将它与对应的拦截器关联在一起。这种方式虽然能够解决问题但是编程体验很差。本篇介绍的基于表达式的拦截器注册方式利用针对目标方法或者属性的调用表达式以一种强类型的方式获取到目标方法极大地改善了编程体验。一、IInterceptorRegistry以表达式采用强类型的方式将指定类型的拦截器应用到目标方法上是借助如下这个IInterceptorRegistry接口完成的。IInterceptorRegistry接口提供了一个ForTInterceptor方法以待注册的拦截器类型关联参数arguments用来提供构建拦截器对象的参数。该方法会返回一个IInterceptorRegistryTInterceptor对象它提供了一系列的方法帮助我们将指定的拦截器应用到指定目标类型通过泛型参数类型TTarget表示相应的方法上。public interface IInterceptorRegistry {IInterceptorRegistryTInterceptor ForTInterceptor(params object[] arguments);... }public interface IInterceptorRegistryTInterceptor {IInterceptorRegistryTInterceptor ToAllMethodsTTarget(int order);IInterceptorRegistryTInterceptor ToMethodTTarget(int order, ExpressionActionTTarget methodCall);IInterceptorRegistryTInterceptor ToMethod(int order, Type targetType, MethodInfo method);IInterceptorRegistryTInterceptor ToGetMethodTTarget(int order, ExpressionFuncTTarget, object? propertyAccessor);IInterceptorRegistryTInterceptor ToSetMethodTTarget(int order, ExpressionFuncTTarget, object? propertyAccessor);IInterceptorRegistryTInterceptor ToPropertyTTarget(int order, ExpressionFuncTTarget, object? propertyAccessor); }封装了IServiceCollection集合的InterceptionBuilder提供了一个RegisterInterceptors扩展方法我们可以利用该方法定义的ActionIInterceptorRegistry类型的参数来使用上述的这个IInterceptorRegistry接口。不论是IServiceCollection接口的BuildInterceptableServiceProvider扩展方法还是IHostBuilder接口的UseInterception方法均提供了一个可选的ActionInterceptionBuilder委托类型的参数。public sealed class InterceptionBuilder {public IServiceCollection Services { get; }public InterceptionBuilder(IServiceCollection services);   }public static class Extensions {public static InterceptionBuilder RegisterInterceptors(this InterceptionBuilder builder, ActionIInterceptorRegistry register);public static IServiceProvider BuildInterceptableServiceProvider(this IServiceCollection services, ActionInterceptionBuilder? setup  null);public static IHostBuilder UseInterception(this IHostBuilder hostBuilder, ActionInterceptionBuilder? setup  null); }二、将拦截器应用到某个类型类似与将InterceptorAttribute标注到某个类型上我们也可以采用这种方式将指定的拦截器应用到目标类型上背后的含义就是应用到该类型可以被拦截的所以方法上含属性方法。public class FoobarInterceptor {public ValueTask InvokeAsync(InvocationContext invocationContext){var method  invocationContext.MethodInfo;Console.WriteLine(${method.DeclaringType!.Name}.{method.Name} is intercepted.);return invocationContext.ProceedAsync();} }public class Foobar {public virtual void M() { }public virtual object? P { get; set; } }我们可以采用如下的方式将调用IInterceptorRegistryTInterceptor的ToAllMethodsTTarget方法将上面定义的拦截器FoobarInterceptor应用到Foobar类型的所有方法上。var foobar  new ServiceCollection().AddSingletonFoobar().BuildInterceptableServiceProvider(interception  interception.RegisterInterceptors(RegisterInterceptors)).GetRequiredServiceFoobar();foobar.M(); foobar.P  null; _  foobar.P;static void RegisterInterceptors(IInterceptorRegistry registry) {var foobar  registry.ForFoobarInterceptor();foobar.ToAllMethodsFoobar(order: 1); }从如下所示的执行结果可以看出Foobar类型的M方法和P属性均被FoobarInterceptor拦截下来源代码。三、应用到指定的方法和属性我们可以通过指定调用方法或者获取属性的表达式来指定拦截器应用的目标方法。我们将目标类型Foobar定义成如下的形式两个重载的M方法和三个属性均是可以拦截的。public class Foobar {public virtual void M(int x, int y) { }public virtual void M(double x, double y) { }public virtual object? P1 { get; set; }public virtual object? P2 { get; set; }public virtual object? P3 { get; set; } }我们利用如下的代码将上面定义的FoobarInterceptor应用到Foobar类型相应的成员上。具体来说我们调用ToMethodTTarget方法应用到两个重载的M方法调用ToPropertyTTarget方法应用到P1属性的Get和Set方法上调用ToGetMethodTTarget和ToSetMethodTTarget方法应用到P2属性的Get方法和P3属性的Set方法。var provider  new ServiceCollection().AddSingletonFoobar().BuildInterceptableServiceProvider(interception  interception.RegisterInterceptors(RegisterInterceptors));var foobar  provider.GetRequiredServiceFoobar();foobar.M(1, 1); foobar.M(3.14, 3.14); foobar.P1  null; _  foobar.P1; foobar.P2  null; _  foobar.P2; foobar.P3  null; _  foobar.P3; Console.ReadLine();static void RegisterInterceptors(IInterceptorRegistry registry) {var foobar  registry.ForFoobarInterceptor();foobar.ToMethodFoobar(order: 1, it  it.M(default(int), default(int))).ToMethodFoobar(order: 1, it  it.M(default(double), default(double))).ToPropertyFoobar(order: 1, it  it.P1).ToGetMethodFoobar(order: 1, it  it.P2).ToSetMethodFoobar(order: 1, it  it.P3); }程序运行后针对Foobar相应成员的拦截体现在如下所示的输出结果上源代码。四、指定构建拦截器的参数如果应用的拦截器类型构造函数指定了参数我们采用这种注册方式的时候也可以指定参数。以如下这个FoobarInterceptor为例其构造函数中指定了两个参数一个是代表拦截器名称的name参数另一个是IFoobar对象。public class FoobarInterceptor {public FoobarInterceptor(string name, IFoobar foobar){Name  name;Foobar  foobar;}public string Name { get; }public IFoobar Foobar { get; }public ValueTask InvokeAsync(InvocationContext invocationContext){Console.WriteLine(${invocationContext.MethodInfo.Name} is intercepted by FoobarInterceptor {Name}.);Console.WriteLine($Foobar is {Foobar.GetType()}.);return invocationContext.ProceedAsync();} } public interface IFoobar { } public class Foo : IFoobar { } public class Bar: IFoobar { }public class Invoker {public virtual void M1() { }public virtual void M2() { } }由于字符串参数name无法从依赖注入容器提取所以在注册FoobarInterceptor是必须显式指定。如果容器能够提供IFoobar对象但是希望指定一个不通过的对象也可以在注册的时候显式指定一个IFoobar对象。我们按照如下的方式将两个不同的FoobarInterceptor对象分别应用到Invoker类型的Invoke1和Invoke2方法上并分别将名称设置为Interceptor1和Interceptor2第二个拦截器还指定了一个Bar对象作为参数容器默认提供的IFoobar对象的类型为Foo。var invoker  new ServiceCollection().AddSingletonInvoker().AddSingletonIFoobar, Foo().BuildInterceptableServiceProvider(interception  interception.RegisterInterceptors(RegisterInterceptors)).GetRequiredServiceInvoker();invoker.M1(); Console.WriteLine(); invoker.M2();static void RegisterInterceptors(IInterceptorRegistry registry) {registry.ForFoobarInterceptor(Interceptor1).ToMethodInvoker(order: 1, it  it.M1());registry.ForFoobarInterceptor(Interceptor2, new Bar()).ToMethodInvoker(order: 1, it  it.M2()); }程序运行之后两个FoobarInterceptor对象的名称和依赖的IFoobar对象的类型以如下的形式输出到控制台上源代码。五、拦截屏蔽除了用来注册指定拦截器的ForTInterceptor方法IInterceptorRegistry接口还定义了如下这些用来屏蔽拦截的SuppressXxx方法。public interface IInterceptorRegistry {IInterceptorRegistryTInterceptor ForTInterceptor(params object[] arguments);IInterceptorRegistry SupressTypeTTarget();IInterceptorRegistry SupressTypes(params Type[] types);IInterceptorRegistry SupressMethodTTarget(ExpressionActionTTarget methodCall);IInterceptorRegistry SupressMethods(params MethodInfo[] methods);IInterceptorRegistry SupressPropertyTTarget(ExpressionFuncTTarget, object? propertyAccessor);IInterceptorRegistry SupressSetMethodTTarget(ExpressionFuncTTarget, object? propertyAccessor);IInterceptorRegistry SupressGetMethodTTarget(ExpressionFuncTTarget, object? propertyAccessor); }我们可以采用如下的方式会将屏蔽掉Foobar类型所有成员的拦截特性虽然拦截器FoobarInterceptor被注册到了这个类型上源代码。var foobar  new ServiceCollection().AddSingletonFoobar().BuildInterceptableServiceProvider(interception  interception.RegisterInterceptors(RegisterInterceptors)).GetRequiredServiceFoobar(); ...static void RegisterInterceptors(IInterceptorRegistry registry) {registry.ForFoobarInterceptor().ToAllMethodsFoobar(order: 1);registry.SupressTypeFoobar(); }下面的程序明确屏蔽掉Foobar类型如下这些方法的拦截能力M方法P1属性的Get和Set方法如果有以及P属性的Get方法源代码。var foobar  new ServiceCollection().AddSingletonFoobar().BuildInterceptableServiceProvider(interception  interception.RegisterInterceptors(RegisterInterceptors)).GetRequiredServiceFoobar();...static void RegisterInterceptors(IInterceptorRegistry registry) {registry.ForFoobarInterceptor().ToAllMethodsFoobar(order: 1);registry.SupressMethodFoobar(itit.M());registry.SupressPropertyFoobar(it  it.P1);registry.SupressGetMethodFoobar(it  it.P2); }六、两个后备方法通过指定调用目标方法或者提取属性的表达式来提供拦截器应用的方法和需要屏蔽的方法提供了较好的编程体验但是能够提供这种强类型编程模式的前提是目标方法或者属性是公共成员。对于受保护protected的方法和属性我们只能使用如下两个后备方法指定代表目标方法的MethodInfo对象。public interface IInterceptorRegistryTInterceptor {IInterceptorRegistryTInterceptor ToMethodsTTarget(int order, params MethodInfo[] methods); }public interface IInterceptorRegistry {IInterceptorRegistry SupressMethods(params MethodInfo[] methods); }
http://www.zqtcl.cn/news/880305/

相关文章:

  • 长兴县建设管理网站抖音小程序注册
  • 做网站容易挣钱吗厦门网页制作厦门小程序app
  • 大型网站开发前端准备北京网站建设V芯ee8888e
  • 关于做营销型网站的建议网页小游戏无需登录
  • 网站短期培训能学什么高校网站建设评比标准
  • 做外贸什么网站比较好做dede鲜花网站模板下载
  • 网站广告推广怎么做网站怎么优化关键词排名
  • 怎样做易支付网站数字化校园建设网站
  • 东莞做网站哪里好公司网站维护怎么维护
  • 微信网站界面设计江阴网站开发公司电话
  • 手机制作网站的软件离石做网站的网络公司
  • 贺州住房和城乡建设部网站广州商城网站建设地址
  • 响应式网站报价服务器上的wordpress
  • 做培训的都上哪些网站东莞网站新站排名
  • 济南网站制郑州快速建站公司
  • 网站推广企业网站建设属于什么工作
  • 公司做网站还是做app用土豆做美食的视频网站
  • 做网站除了广告还有什么收入的中国计算机技术职业资格网
  • 陕西建设银行网站查排名的软件有哪些
  • 企业网站备案教程北京专业做网站的
  • 音乐网站如何建设的如何做学校网站
  • 济南比较好的网站开发公司个人注册网站怎么注册
  • 济南高端网站设计策划图书馆网站建设情况汇报
  • 知识付费网站建设做网站源码
  • php网站开发实训报告书怎么做兼职类网站吗
  • 建设银行u盾用网站打不开中企动力值不值得入职
  • 织梦做的网站有点慢商贸网站
  • 海外红酒网站建设wordpress 分类 文章
  • 七星彩网站建设wordpress w3
  • 广州网站建设全包百度怎么优化关键词排名