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();
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~缓存拦截器支持类的虚方法了的更多相关文章
- Spring使用拦截器支持国际化(转)
Spring使用拦截器支持国际化很方便,使用时只需要两个步骤: 一.spring配置 具体配置方式如下: <!-- 资源文件绑定器,文件名称:messages.properties(没有找到时的 ...
- Asp.net Core 3.1基于AspectCore实现AOP,实现事务、缓存拦截器
最近想给我的框架加一种功能,就是比如给一个方法加一个事务的特性Attribute,那这个方法就会启用事务处理.给一个方法加一个缓存特性,那这个方法就会进行缓存. 这个也是网上说的面向切面编程AOP. ...
- 我心中的核心组件(可插拔的AOP)~第二回 缓存拦截器
回到目录 AOP面向切面的编程,也称面向方面的编程,我更青睐于前面的叫法,将一个大系统切成多个独立的部分,而这个独立的部分又可以方便的插拔在其它领域的系统之中,这种编程的方式我们叫它面向切面,而这些独 ...
- SpringMVC 学习-拦截器 HandlerInterceptor 类
一.拦截器 HandlerInterceptor 类的作用 SpringMVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理. 二.怎么使用呢? 1. ...
- 访问祖先类的虚方法(直接访问祖先类的VMT,但是这种方法在新版本中未必可靠)
访问祖先类的虚方法 问题提出 在子类覆盖的虚方法中,可以用inherited调用父类的实现,但有时候我们并不需要父类的实现,而是想跃过父类直接调用祖先类的方法. 举个例子,假设有三个类,实现如下: t ...
- Python 装饰器装饰类中的方法
title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] categ ...
- Okhttp 插入缓存拦截器 解析
我们在做网络请求的时候,如果网络请求过于频繁而且请求的数据变动不大,或者基本没有变动,这个时候如果没有缓存功能,我们想一下 会浪费掉多少资源,一次请求刷新一次,去请求一次,不但会消耗用户的流量,而且还 ...
- 拦截器配置类使用继承写法导致jackson的全局配置失效
问题描述 项目中需要一个拦截器用于拦截请求,在没有请求中生成requestId.然后写了一个配置类,这个类继承了 WebMvcConfigurationSupport类,重写了addIntercept ...
- C#属性-索引器-里氏替换-多态-虚方法-抽象-接口-泛型-
1.属性 //属性的2种写法 public class person { private string _name; public string Name { get { return _name; ...
随机推荐
- 使用mutt+msmtp做linux邮件客户端
下载MSMTP wget http://nchc.dl.sourceforge.net/sourceforge/msmtp/msmtp-1.4.17.tar.bz2 tar xvf msmtp-1 ...
- HTML Document 头
1. 比较宽松的HTML格式,样式 <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"> 如下 ...
- stm32之开发入门
一.开发环境配置 在开发stm32应用之前,我们需要先配置好开发环境. 首先从keil官网下载keil MDK-ARM软件包(v5版本与v4版本不同,v5版本需要下载额外的stm32芯片包)和芯片包( ...
- Linux命令总结_文件操作之cut
1.cut命令 语法格式 cut [-bn] [file] 或 cut [-c] [file] 或 cut [-df] [file],有以下几个选项 -b :以字节为单位进行分割.这些字节位置将 ...
- 反射获取窗体所有控件的Text
可以直接通过反射获取当前窗体的所有控件的Text(具有Text属性),具体代码如下: foreach (var field in form.GetType().GetFields(System.Ref ...
- vb常用命名空间
摘自:http://www.2cto.com/kf/201211/170837.html 感谢 (一)如下是系统中分离出来Imports MicrosoftImports Microsoft.CSha ...
- Linux 基础命令(一)
Linux 基础: https://www.cnblogs.com/linhaifeng/articles/6045600.html Linux 比 Windows 更稳定做服务器,开发出来的软件需要 ...
- Working Experience - How to handle the destroyed event of UserControl
正文 问题: UserControl 如何在父窗体(程序)关闭时, 释放一些需要手动释放的资源 方法: 使用 Control.FindForm() 获取父窗体, 从而得到父窗体的 Closing/Cl ...
- 从扫码支付想到的超级APP主宰一切,数据!数据!还是数据!
前言 做室内定位的人其实内心都明白:基于指纹方法的移动端定位,无论paper每年出来多少,距离真正的大规模应用的距离还有多么遥远.指纹采集,指纹更新,似乎在生产实践上就是不可能的难题.所有还在基于人工 ...
- Swoole WebSocket 的应用
目录 概述 代码 小结 概述 这是关于 Swoole 学习的第三篇文章:Swoole WebSocket 的应用. 第二篇:Swoole Task 的应用 第一篇:Swoole Timer 的应用 什 ...