首页 > 其他分享 >解决在.net8 WebAPI中 AOP 使用AbstractInterceptorAttribute

解决在.net8 WebAPI中 AOP 使用AbstractInterceptorAttribute

时间:2024-09-04 23:25:46浏览次数:11  
标签:WebAPI net8 Interceptors virtual next AOP new config AbstractInterceptorAttribut

在网上找了许多例子 但是放在.net8 就不好使了 比如 在Program 中配置 IInterceptor或者 services.ConfigureDynamicProxy ,网上说的对 但是也不全对

//通过单元测试(MSTest)
//创建IServiceCollection 
IServiceCollection services = new ServiceCollection();

 是能调用AbstractInterceptorAttribute ,但是 用 WebAPI 就失效,断点都不进

尝试了网上大神的方法,发现 通过配置 失败

//ConfigureDynamicProxy (失败)
builder.Services.ConfigureDynamicProxy(config =>
{
    config.Interceptors.AddTyped<RedisInterceptorAttribute>();
    config.Interceptors.AddServiced<RedisInterceptorAttribute>();
    config.Interceptors.AddDelegate(async (content, next) =>
    {
        Console.WriteLine("delegate interceptor"); await content.Invoke(next);
    });
    config.Interceptors.AddTyped<RedisInterceptorAttribute>();
});
//Autifac UseServiceProviderFactory (失败)
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder => { 
                containerBuilder.RegisterType<RedisInterceptorAttribute>();
                containerBuilder.RegisterType<RedisDemoLogic>()
               .EnableClassInterceptors()
               .InterceptedBy(typeof(RedisInterceptorAttribute));

});

成功解决方案,使用Aotifac 

//在Program 只需要配置这一句就行
builder.Host.UseServiceProviderFactory(new DynamicProxyServiceProviderFactory());

 实现AbstractInterceptorAttribute

    /// <summary>
    /// Json Redis缓存 注解
    /// </summary>
    public class RedisInterceptorAttribute : AbstractInterceptorAttribute, IEquatable<RedisInterceptorAttribute>
    { 
          public override async Task Invoke(AspectContext context, AspectDelegate next){
                  //进入方法前 ,判断是否有缓存
                   await context.Invoke(next);
                   //方法结束后添加到缓存
          }
    }
    

在使用时 在方法上一定要加virtual !!!

     //一定要加virtual
     [RedisInterceptor("school")]
     public virtual async Task<List<string>> SelectAsync(Guid[] schoolId)
     {
         ///业务
         return new();
     }

 完毕 一定要加virtual !!!

QQ群: 929412850 (Byte.Core 框架交流群)
未经作者同意,禁止转发

标签:WebAPI,net8,Interceptors,virtual,next,AOP,new,config,AbstractInterceptorAttribut
From: https://www.cnblogs.com/wxhwpmdyz/p/18397507

相关文章

  • 面试官:谈谈你对 IoC 和 AOP 的理解!
    这是一道超级常见的Spring面试题。这篇文章会从下面从以下几个问题展开对IoC&AOP的解释:什么是IoC?IoC解决了什么问题?IoC和DI的区别?什么是AOP?AOP解决了什么问题?AOP的应用场景有哪些?AOP为什么叫做切面编程?AOP实现方式有哪些?首先声明:IoC&AOP......
  • Blazor项目中建立WebApi
    Blazor项目中建立WebApiProgram.cs中添加代码://第一步builder.Services.AddControllers();.....//第二步app.MapControllers(); 创建接口文件 usingMicrosoft.AspNetCore.Mvc;namespaceNiunan.Net.Charge.BlazorWeb.JieKou{[Route("/api/[c......
  • 通过自定义注解、反射和AOP在Spring Boot中动态修改请求参数
    在SpringBoot中,通过自定义注解、反射以及AOP(面向切面编程)来动态修改请求参数是一种高级且强大的技术组合,它允许开发者在不修改原始方法实现的情况下,对方法的执行过程进行干预和定制。这种技术通常用于日志记录、权限校验、参数校验、数据脱敏等场景。下面,我将详细阐述如何......
  • 【Java】Spring-AOP与拦截器实战 (上手图解)
    Java系列文章目录补充内容Windows通过SSH连接Linux第一章Linux基本命令的学习与Linux历史文章目录Java系列文章目录一、前言二、学习内容:三、问题描述四、解决方案:4.1认识依赖4.2使用AOP与拦截器4.2.1使用AOP4.2.1.1设置DemoAop类4.2.2.2设置切面4.2.2.3设......
  • spring学习日记-day6-AOP
    一、学习目标        面向切面的编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象的编程(OOP)。OOP中模块化的关键单位是类,而AOP中模块化的单位是切面。切面使跨越多种类型和对象的关注点(如事务管理)模块化。    spring的关键组件之一是AOP框架。虽然Spr......
  • MediatR实现高效信息传递,以.net8做demo演示
    MediatR是.NET下的一个实现消息传递的库,轻量级、简洁高效,用于实现进程内的消息传递机制。它基于中介者设计模式,支持请求/响应、命令、查询、通知和事件等多种消息传递模式。通过泛型支持,MediatR可以智能地调度不同类型的消息,非常适合用于领域事件处理。我们将定义一个命令、......
  • 每日一题08:说一下Spring AOP动态代理模式
    回答1:SpringAOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。SpringAOP中的动态代理主要有两种方式,JDK动态代理和CGL......
  • .Net 5.0 WebAPI 发布至 Linux 系统
    阅读目录〇、前言一、Linux环境准备1.1CentOS7.x在线安装.net5.01.2CentOS8.x在线安装.net5.01.3查看是否安装成功二、示例项目创建和发布2.1创建一个测试项目2.2发布步骤三、服务开启和配置自启动3.1服务开启3.2将服务配置为系统自启动......
  • IoC&AOP详解
    1.IoC1.1什么是IoC    IoC即控制反转/反转控制。它是一种思想而不是一种技术实现,描述的是:Java开发领域对象的创建以及管理的问题    例如:现有类A依赖类B        传统开发方式:在类A中通过new关键字来创建一个类B的对象      ......
  • Spring高手之路22——AOP切面类的封装与解析
    1.AOP是如何收集切面类并封装的?在 Spring 中,AOP(Aspect-OrientedProgramming,面向切面编程)通过以下几个步骤收集切面类并进行封装:1.定义切面类:切面类通过 @Aspect 注解来标记,表示这是一个切面。在切面类中定义通知(advice),例如 @Before、@After、@Around 等,用于指定在目标方法......