写它的原因

之前写过一个缓存拦截器,主要在方法上添加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<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~缓存拦截器支持类的虚方法了的更多相关文章

  1. Spring使用拦截器支持国际化(转)

    Spring使用拦截器支持国际化很方便,使用时只需要两个步骤: 一.spring配置 具体配置方式如下: <!-- 资源文件绑定器,文件名称:messages.properties(没有找到时的 ...

  2. Asp.net Core 3.1基于AspectCore实现AOP,实现事务、缓存拦截器

    最近想给我的框架加一种功能,就是比如给一个方法加一个事务的特性Attribute,那这个方法就会启用事务处理.给一个方法加一个缓存特性,那这个方法就会进行缓存. 这个也是网上说的面向切面编程AOP. ...

  3. 我心中的核心组件(可插拔的AOP)~第二回 缓存拦截器

    回到目录 AOP面向切面的编程,也称面向方面的编程,我更青睐于前面的叫法,将一个大系统切成多个独立的部分,而这个独立的部分又可以方便的插拔在其它领域的系统之中,这种编程的方式我们叫它面向切面,而这些独 ...

  4. SpringMVC 学习-拦截器 HandlerInterceptor 类

    一.拦截器 HandlerInterceptor 类的作用 SpringMVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理. 二.怎么使用呢? 1. ...

  5. 访问祖先类的虚方法(直接访问祖先类的VMT,但是这种方法在新版本中未必可靠)

    访问祖先类的虚方法 问题提出 在子类覆盖的虚方法中,可以用inherited调用父类的实现,但有时候我们并不需要父类的实现,而是想跃过父类直接调用祖先类的方法. 举个例子,假设有三个类,实现如下: t ...

  6. Python 装饰器装饰类中的方法

    title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] categ ...

  7. Okhttp 插入缓存拦截器 解析

    我们在做网络请求的时候,如果网络请求过于频繁而且请求的数据变动不大,或者基本没有变动,这个时候如果没有缓存功能,我们想一下 会浪费掉多少资源,一次请求刷新一次,去请求一次,不但会消耗用户的流量,而且还 ...

  8. 拦截器配置类使用继承写法导致jackson的全局配置失效

    问题描述 项目中需要一个拦截器用于拦截请求,在没有请求中生成requestId.然后写了一个配置类,这个类继承了 WebMvcConfigurationSupport类,重写了addIntercept ...

  9. C#属性-索引器-里氏替换-多态-虚方法-抽象-接口-泛型-

    1.属性 //属性的2种写法 public class person { private string _name; public string Name { get { return _name; ...

随机推荐

  1. linux网络编程 ntohs, ntohl, htons,htonl inet_aton等详解

    ntohs =net to host short int 16位 htons=host to net short int 16位 ntohs =net to host long int 32位 hto ...

  2. python爬虫知识点总结(三)urllib库详解

    一.什么是Urllib? 官方学习文档:https://docs.python.org/3/library/urllib.html 廖雪峰的网站:https://www.liaoxuefeng.com ...

  3. wpf datagrid row的命中测试

    1. 添加鼠标左键处理 AddHandler(DataGrid.MouseLeftButtonDownEvent, new RoutedEventHandler(grdStudyList_MouseL ...

  4. 兼容ie6,ie7,ie8,firefox,chrome浏览器的代码片段

    hack实现方式和原理 #hacker{ color:red; *color:white; /*for ie6,ie7*/ *+color:blue; /*for ie7*/ _color:gray; ...

  5. 【转】Pro Android学习笔记(六):了解Content Provider(中)

    Content Provider的架构 Authority类似web中的域名,每个content provider会通过AndroidManifest.xml向系统注册authority,如下.其中n ...

  6. typedef 函数指针的用法

    转自:http://www.cnblogs.com/shenlian/archive/2011/05/21/2053149.html typedef 函数指针的用法 在网上搜索函数指针,看到一个例子. ...

  7. Python 同ip网站查询(制作网站接口)

    老师专门打电话回来说不让玩电脑~~   呵呵.  LOL把被人坑死了. 五排果然不适合我. 去翻了下曾经的Python项目. 在爬虫文件夹下面找到了这个. 我也就厚脸皮的什么都不改就放上来了: #co ...

  8. linux svn 客户端基本使用命令

    1.从svn获取项目 svn co URL --username XX --password XX; 2.添加code file svn add codeFile; svn ci -m "c ...

  9. javascript的三个函数

    作为刚刚学习javascript的小白,最近阅读了额<Javascript Dom编程艺术>,其中有三个函数感觉很是有用,特此收藏. insertAfter函数:针对insertBefor ...

  10. URL shortening service

    Use Cases 1, shortening : take a URL => return a much shorter URL 2, redirection : take a short U ...