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框架!
本文转自博客园张占岭(仓储大叔)的博客,原文链接:LindAgile~缓存拦截器支持类的虚方法了,如需转载请自行联系原博主。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
微服务~Eureka实现的服务注册与发现及服务之间的调用
微服务里一个重要的概念就是服务注册与发现技术,当你有一个新的服务运行后,我们的服务中心可以感知你,然后把加添加到服务列表里,然后当你死掉后,会从服务中心把你移除,而你作为一个服务,对其它服务公开的只是服务名称,而不是最终的服务地址URL,这对于云平台,容器化架构来说是非常重要的! 安装单独的Eureka服务(server) 服务注册-aspnetcore建立Eureka客户端(client) 服务发现-实现服务与服务的调用 一 安装单独的Eureka服务 安装tomcat,到apache官网http://tomcat.apache.org下载tomcat 下载Eureka,可以到http://mvnrepository.com/artifact/com.netflix.eureka/eureka-server选择一下版本下载 配置端口,默认是8080,tomcat\webapps\eureka\WEB-INF\classes\eureka-client.properties 重启tomcat服务即可 二 aspnetcore建立Eureka客户端(client) nuget添加包包Pi...
- 下一篇
面向服务架构~本地轮训服务占用内存过高的问题
对于WEB程序来说,它寄宿在IIS提供的w3wp进程中,这个进程占用的内存大小和你的应用程序的使用有个直接关系,你的程序写的标准,它占用内存就相对低,你的程序写的伪范规,该释放的东西不让系统释放(有些对象GC回收不了),就会造成内存使用过高的情况,对于32位系统来说,最高1.6G,超过后,进程自动挂掉! 对于本地服务来说,一般我们采用windowService,windowform来承载,它会自己有一个进程,而最近,我的windowService占用内存过高的问题真的出现了,不到5分钟,进程已经达到500多兆了,而且还在处理递增长的趋势,当我们review代码后,发现了一个大问题,看下面代码您是否也发现了呢,代码里的坏味道 public class User_SendMessageJob : JobBase, IJob { private static object lockObj = new object(); private object IBigRepository = new object(); public void Execute(IJobExecutionContext ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果