LindAgile~缓存拦截器支持类的虚方法了
写它的原因
之前写过一个缓存拦截器,主要在方法上添加CachingAspect特性之后,它的返回值就可以被缓存下来,下次访问时直接从缓存中返回结果,而它有一个前提,就是你的方法需要是一个接口方法,缓存这个CachingAspect却需要在类里定义,大叔感觉很怪,所以抽时间把它完善一下,让缓存特性在接口方法里定义。
今天说的是为类里的虚方法添加CachingAspect,这个事实上我们用的比较多,因为并不是所有方法都需要提取到接口的,只有那些可能有多态的情况才需要实现这种功能,所以大叔觉得有必要为类的虚方法添加一个缓存拦截的功能。
拦截的原理
主要是建立一个新的类,然后让它继承被拦截的类型,找到声明为virtual的方法,然后去override它,我们的拦截器使用了emit实现了建立类,建立方法等功能。
- -》程序入口
- -》 建立代理
- -》建立新程序集
- -》建立新模块
- -》建立新类
- -》继承被拦截的类
- -》重写virtual方法
- -》添加缓存逻辑
- -》返回
实例代码
public class AOP { [CachingAspect(CachingMethod.Get)] public virtual string Hello() { return DateTime.Now.ToString(); } }
使用它
var aop = ProxyFactory.CreateProxy<AOP>(); 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框架!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2016-08-10 Lind.DDD.Manage项目核心技术分享
2013-08-10 我心中的核心组件(可插拔的AOP)~第四回 异常拦截器
2012-08-10 第三回 基类中的方法,应该根据实际情况,虚的虚,抽象的抽象!
2012-08-10 将不确定变为确定~SQLSERVER是否可以进行位运算?
2011-08-10 LINQ~什么时候使用SelectMany和GroupBy
2011-08-10 自己提出的程序开发三大原则:代码简洁,结构清晰,合理运用