C# 面向切片编程AOP

本文介绍了C#中的面向切片编程AOP概念,以及在ASP.NETCORE中如何实现,如授权验证、资源缓存、方法过滤和异常处理。通过示例展示了如何创建自定义过滤器实现请求前后的操作,例如利用IResourceFilter进行缓存管理,提高代码复用性和可维护性。
摘要由CSDN通过智能技术生成

一、面向切片编程AOP

1、场景一:运行很久的项目需要增加新的功能,如要增加异常日志记录及处理,那应该怎么办呢?
如果直接增加代码,将造成重复代码,增加了大量测试工作。所以最好的方法就是使用AOP

AOP 全称Aspect Oriented Programming 在不修改之前代码为基础,可以动态增加业务逻辑。

ASP.NET CORE 中的AOP

1 AuthorizeAttrbute 权限验证

2 IRescourceFiter 资源缓存

IRescourceFiter 的场景应用
1、天生为了缓存而生
2、支持扩展缓存

新建一个Attrbute为后缀的类,继承Attribute, IResourceFilter

using Microsoft.AspNetCore.Mvc.Filters;

namespace Asp.net6.Utility.Filters
{
    public class CUMSFilterAttribute : Attribute, IResourceFilter
    {
       /// <summary>
       /// 在XX资源之前
       /// </summary>
       /// <param name="context"></param>
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            Console.WriteLine("执行之前");
        }
        /// <summary>
        /// 在XX资源之后
        /// </summary>
        /// <param name="context"></param>
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            Console.WriteLine("执行之后");
        }
    }
}

在方法前调用CUMSFilterAttribute

        [CUMSFilter]
        public IActionResult Index()
        {
            { 
            //这里是业务逻辑
            }
            return View();
        }

执行顺序
1、CUMSFilterAttribute .OnResourceExecuting
2、控制器的构造参数–实例化控制器
3、执行Action方法
4、CUMSFilterAttribute .OnResourceExecuted

具体案例

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

namespace Asp.net6.Utility.Filters
{
    public class CUMSFilterAttribute : Attribute, IResourceFilter
    {
        //1.定义了一个缓存区域
        //2.请求来了,根据缓存标识--判断如果有缓存,返回缓存的值
        //3.如果没有缓存做计算
        //4.计算结果保存到缓存中去

        //定义静态缓存区
        private static Dictionary<string, object> CacheDictionary = new Dictionary<string, object>();
        /// <summary>
        /// 在XX资源之前
        /// </summary>
        /// <param name="context"></param>
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            string Key = context.HttpContext.Request.Path;//请求的路径
            if (CacheDictionary.ContainsKey(Key)) {
                //只要给Result赋值了,就会中断执行,直接返回调用方
                context.Result =(IActionResult) CacheDictionary[Key];
            }
            Console.WriteLine("执行之前");
        }

        /// <summary>
        /// 在XX资源之后
        /// </summary>
        /// <param name="context"></param>
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            string Key = context.HttpContext.Request.Path;//请求的路径
            CacheDictionary[Key] = context.Result;
            Console.WriteLine("执行之后");
        }

    }
}

3 IActionFiter 方法前后记录

4 IResultFiter 结果生成前后扩展

5 IAlwaysRun 响应结果的补充

6 IExceptionFiter 异常处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值