• LindAgile~缓存拦截器支持类的虚方法了


    写它的原因

    之前写过一个缓存拦截器,主要在方法上添加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(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框架!

  • 相关阅读:
    深入js——this
    深入js——作用域链
    深入js——变量对象
    深入js——执行上下文栈
    vue为什么不能检测数组的变化
    常用的文件下载方式
    vue中修改第三方组件的样式不生效
    Neo4j 学习笔记2
    Neo4j 学习笔记1
    idea git 命令
  • 原文地址:https://www.cnblogs.com/lori/p/7338206.html
Copyright © 2020-2023  润新知