首页 > 其他分享 >.Net6 web API (AOP理解--ResourceFilter)

.Net6 web API (AOP理解--ResourceFilter)

时间:2024-05-17 14:30:44浏览次数:19  
标签:web 逻辑 -- 代码 yanfanNet6WebApi API Filters using public

前沿

Aop(AspectorientProgramming),面向切面编程,作为面向对象编程的一种补充,可以在不破坏之前的封装

为基础动态增加一些功能;从而让系统更具备扩展性:

增加一个缓存功能

增加一个日志功能

既希望不要违背开闭原则,也希望能够增加新的工能

在之前的业务逻辑之前增加了逻辑,

在之前的业务逻辑之后增加了逻辑

  

在AOP中,横切关注点通常指的是与主要业务逻辑无关但在整个应用程序中多个地方都存在的功能,
例如日志记录、性能监控、事务管理、安全验证等。通过AOP,我们可以将这些横切关注点抽取出来,
并通过特定的技术(例如代理、装饰器等)将它们应用到主要业务逻辑中,而不需要在业务逻辑中显式地编写这些代码。

举例代码:

新建代码目录

 

using System;
using Microsoft.AspNetCore.Mvc.Filters;

namespace yanfanNet6WebApi.Utility.Filters
{
    /// <summary>
    /// 自定义 接口
    /// </summary>
    // 继承 Attribute 并且实现接口话 IResourceFilter
    public class CustomResourceFilterAttribute : Attribute , IResourceFilter
    {
        /// <summary>
        /// 在莫某资源后
        /// </summary>
        /// <param name="context"></param>
        /// <exception cref="NotImplementedException"></exception>
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            Console.WriteLine("CustomResourceFilterAttribute.OnResourceExecuted");
        }

        /// <summary>
        /// 在莫某资源前
        /// </summary>
        /// <param name="context"></param>
        /// <exception cref="NotImplementedException"></exception>
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            Console.WriteLine("CustomResourceFilterAttribute.OnResourceExecuting");
        }
    }
}

异步请求

 

using System;
using Microsoft.AspNetCore.Mvc.Filters;

namespace yanfanNet6WebApi.Utility.Filters
{
    /// <summary>
    ///  自定义 AsyncResourceFilter
    /// </summary>
    public class CustomAsyncResourceFilterAttribute : Attribute, IAsyncResourceFilter
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="context"></param>
        /// <param name="next"></param>
        /// <returns></returns>
        public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
        {
            Console.WriteLine("CustomAsyncResourceFilterAttribute OnResourceExecutionAsync");
            await next.Invoke(); // 条用下一个
        }
    }
}

然后在控制器

新建 

IResourceFilter

FilterController.cs 代码
using Microsoft.AspNetCore.Mvc;
using yanfanNet6WebApi.Utility.Filters;
using yanfanNet6WebApi.Utility.Swagger;

namespace yanfanNet6WebApi.Controllers;

/// <summary>
/// 文件资源
/// </summary>
[ApiController]
[Route("[controller]")]
[ApiVersion("2.0")]
[Route("[controller]/v{version:apiVersion}")]
public class FilterController : ControllerBase
{

    private readonly ILogger<FilterController> _logger;

    public FilterController(ILogger<FilterController> logger)
    {
        _logger = logger;
    }

    /// <summary>
    /// 获取用户信息
    /// </summary>
    /// <returns></returns>
    [HttpGet]
    [Route("{id:int}")]
    [CustomResourceFilterAttribute]
    public IActionResult GetUser(int id)
    {

        Console.WriteLine("==== 业务逻辑处理 ====");
        var data = new
        {
            Id = id,
            Success = 234,
            Name = "fanfan",
            DateTime = DateTime.Now.ToString()
        };

        return new JsonResult(data);
    }

}

然后打断点:

 

 

 

移步同步扩展

运行:

 

然后你会发现会先到

OnResourceExecutionAsync 这个方法 里

 

再到控制里面的

 

就是可以在不碰业务代码的,可以在里面穿插一些其他功能的代码 比如 日志记录、性能监控、事务管理、安全验证

 

 

动态代理:通过动态代理技术,在运行时动态地为目标对象生成代理对象,代理对象可以在目标对象的方法执行前后执行横切关注点的代码。
在.NET中,可以使用框架如Castle DynamicProxy、Unity Interception等来实现动态代理。 属性:通过自定义属性(Attribute),可以将横切关注点与目标方法进行关联,并在运行时通过反射等方式来获取属性信息并执行相应的处理逻辑。例如,在ASP.NET Core中,可以使用特性如[Authorize]、[HttpPost]等来实现安全验证、HTTP方法匹配等功能。 依赖注入:通过依赖注入容器,可以在目标对象的创建过程中动态地为对象添加额外的行为。例如,可以通过在服务注册过程中使用装饰器模式来为服务添加缓存、日志等功能。 动态方法/委托:通过动态创建方法或委托对象,并在方法或委托的执行前后执行横切关注点的代码。在.NET中,可以使用Expression Trees、Func/Action等来动态创建方法或委托对

 

标签:web,逻辑,--,代码,yanfanNet6WebApi,API,Filters,using,public
From: https://www.cnblogs.com/yf-html/p/18197698

相关文章

  • npm install 报错
    一问题npminstall报错 二解决看报错提示内容"thiscommandwith--forceor--legacy-peer-deps"命令改成这样:npminstall--force  三备注npmERR!codeERESOLVEnpmERR!ERESOLVEunabletoresolvedependencytreenpmERR!npmERR!Whileresolving:vue......
  • docker debug记录
    Error1:failedtoregisterlayer:open/data1/Installer/dockerInstallDir/docker/overlay2/5ee088aebf668f13b34c528c8009e67fe6aec5592f692dc5425c3e0d32bc4427/.tmp-committed2657031997:nosuchfileordirectory$dockersystemprune-a$systemctlstopdocker......
  • 软考高级之132个工具和技术
     参考博客:https://blog.csdn.net/cainiao080605/article/details/134270267......
  • KubeKey v3.1 发布:快速自定义离线安装包
    日前,KubeKeyv3.1正式发布。该版本主要对离线场景部署、离线包制作以及向Kubernetesv1.24+升级进行了优化。KubeKey简介KubeKey是KubeSphere社区开源的一款高效集群部署工具,运行时默认使用Docker,也可对接Containerd、CRI-O、iSula等CRI运行时,且ETCD集群独立运行......
  • [Javascript] Object.groupBy & Map.groupBy
    ArrayGrouping isthenewfeatureofJavaScript/ECMAScript,whichsplitsanarray(or,generally,aniterable),intosmallersub-arrays.GroupingisdifferentthanotherJSarraymethods-it's not apartofthearrayprototype,butastaticmethod.......
  • js 判断数组中的所有值是否相同
    使用Set数据结构:将数组转换为Set,如果Set的长度为1,则说明数组中所有的值都相同。使用for循环:遍历数组,将每个元素与前面的元素进行比较,如果存在不同的元素,则说明数组中的所有值不相同。使用Array.prototype.every()方法:使用every方法遍历数组,判断数组中的每个元素是否......
  • 【Linux】《VMware17搭建Ubuntu.22.04-Rust开发环境》
    下载VMware17安装包下载链接:创建虚拟机之后都默认就可以了。进入系统设置登录账号和密码以及修改下语言,剩余都默认即可。设置中文界面设置中文输入法接下来开始设置输入法切换快捷键设置使用Ctrl+Alt+T打开终端,输入ibus-setup重启,看一下是......
  • Java(6)-Java内存区域和作用
    本文在终于搞懂了java8的内存结构,再也不纠结方法区和常量池了!_java8堆中存放静态变量和字符串常量池吗-CSDN博客基础上加入了一些个人思考,原文写得就很通俗易懂,推荐Java内存Java程序在运行过程中使用的内存可以分成虚拟内存和本地内存两大类。虚拟内存虚拟内存,就是指JVM自己管......
  • 多线程下使用List中的subList和remove方法产生的 java.util.ConcurrentModificationEx
    在说多线程操作List之前,我们先看下单线程下产生的问题:单线程List<Integer>listA=newArrayList<>();listA.add(1);listA.add(2);listA.add(3);listA.add(4);listA.add(5);listA.add(6);for(Integera:listA){......
  • 「杂题乱刷」洛谷 P10467
    题目链接P10467[CCC2007]SnowflakeSnowSnowflakes解题思路字符串哈希板子题。思路就是我们给每个数列的所有排列都哈希一个值,然后判断是否有不同的数列的哈希值相同,如果有,就输出Twinsnowflakesfound.,否则就输出Notwosnowflakesarealike.。参考代码这里使用双哈......