博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LindAgile~缓存拦截器支持类的虚方法了
阅读量:7240 次
发布时间:2019-06-29

本文共 1708 字,大约阅读时间需要 5 分钟。

写它的原因

之前写过一个缓存拦截器,主要在方法上添加CachingAspect特性之后,它的返回值就可以被缓存下来,下次访问时直接从缓存中返回结果,而它有一个前提,就是你的方法需要是一个接口方法,缓存这个CachingAspect却需要在类里定义,大叔感觉很怪,所以抽时间把它完善一下,让缓存特性在接口方法里定义。

今天说的是为类里的虚方法添加CachingAspect,这个事实上我们用的比较多,因为并不是所有方法都需要提取到接口的,只有那些可能有多态的情况才需要实现这种功能,所以大叔觉得有必要为类的虚方法添加一个缓存拦截的功能。

拦截的原理

主要是建立一个新的类,然后让它继承被拦截的类型,找到声明为virtual的方法,然后去override它,我们的拦截器使用了emit实现了建立类,建立方法等功能。

  1. -》程序入口
  2. -》 建立代理
  3. -》建立新程序集
  4. -》建立新模块
  5. -》建立新类
  6. -》继承被拦截的类
  7. -》重写virtual方法
  8. -》添加缓存逻辑
  9. -》返回

实例代码

public class AOP    {        [CachingAspect(CachingMethod.Get)]        public virtual string Hello()        {            return DateTime.Now.ToString();        }    }

使用它

var aop = ProxyFactory.CreateProxy
(); Console.WriteLine(aop.Hello()); Thread.Sleep(1000); Console.WriteLine(aop.Hello());

缓存结果存储到了redis中间件里

修改了LindAspect的代码段,对代理服务的完善,对类虚方法的支持!

对代理类也进行修改,添加了接口与类的判断

if (_interfaceType.IsInterface)//接口代理            {                _typeBuilder = _moduleBuilder.DefineType(string.Format(TypeNameFormat, _realProxyType.Name),                   TypeAttributes.Public | TypeAttributes.Sealed);                _typeBuilder.AddInterfaceImplementation(_interfaceType);            }            else//类代理,虚方法可以被重写            {                _typeBuilder = _moduleBuilder.DefineType(string.Format(TypeNameFormat, _realProxyType.Name),                 TypeAttributes.Public | TypeAttributes.Sealed, _interfaceType);            }

下一步,大步将再次进行优化,争取早日支持接口方法拦截功能,而不是把拦截特性写在类里。

像下面的代码,既然用了接口,就应该把特性写在接口方法上,您说是吧!

public interface IAOP    {        [CachingAspect(CachingMethod.Get)]        string Hello();    }    public class AOP2 : IAOP    {        public string Hello()        {            return DateTime.Now.ToString();        }    }

感谢阅读!

请关注大叔新宠LindAgile框架!

 

转载地址:http://ohrfm.baihongyu.com/

你可能感兴趣的文章
android学习笔记之一常用控件
查看>>
nginx正向代理配置
查看>>
人生不能纠结
查看>>
MySQL(User&Grant)
查看>>
网站数据库中“密码加密”方法思考
查看>>
不要随便设置随机种子
查看>>
3.4Java基本类型转换
查看>>
从零开始用 Flask 搭建一个网站(四)
查看>>
这就是我想要的 VSCode 插件!
查看>>
GraphQL 如何取代 Redux
查看>>
【FFMPEG】高级使用
查看>>
CSS3 制作动画效果的属性
查看>>
Pycharm远程调试之Docker debug
查看>>
WebDataBinder
查看>>
在MySQL字段中使用逗号分隔符
查看>>
初学数据结构--数组
查看>>
成员函数的重载、覆盖与隐藏
查看>>
html5 Web Socket
查看>>
统计花园内每天,每个门进入的人数及总人数.
查看>>
javascript 解析或转换json和xml
查看>>