C#仿Spring用@Cacheable和@CacheEvict注入Redis缓存

返回
Author Avatar
钢翼
2019-08-16
编程
222

最近用java的spring发现了@Cacheable和@CacheEvict这两个注解可以很方便的管理redis缓存,于是先找c#的代替品。

找来找去只在github上找个一个基于PostSharp的https://github.com/danilobsi/RedisCacheAttribute,不过PostSharp是付费的,所以找了一个PostSharp的代替品KingAOP https://github.com/AntyaDev/KingAOP

只是使用起来稍微麻烦了点,记录以下使用KingAOP需要注意的点。

  1. 自定义的属性可以继承两个类 ,一个是OnMethodBoundaryAspect 一个是MethodInterceptionAspect

    前者不会阻止程序运行,有几个方法可以继承分别是OnEntry(进入函数时),OnSuccess(执行成功时),OnException(发生异常时),OnExit(退出函数时),很适合写@CacheEvict,在OnEntry直接清除缓存即可。

    后者可以拦截不执行程序,有一个方法可以继承OnInvoke,通过调用base.OnInvoke(args)继续执行原函数。适合写@Cacheable,判断缓存有则设置args.ReturnValue,然后直接return就可以了。

  2. OnInvoke中不可以获取属性的,如果需要属性,需要通过反射的方式获取

 var attr = args.Method.GetCustomAttributes(typeof(NotNullInvocationAspect),false);

  3. 所有用到KingAOP的类必须继承IDynamicMetaObjectProvider接口,实现方法如下

 public DynamicMetaObject GetMetaObject(System.Linq.Expressions.Expression parameter)
        {
            return new AspectWeaver(parameter, this);
        }

  4,使用到KingAOP的类,声明必须是dynamic。所以如果使用了IoC注入的话,注意只能通过构造方法注入,不能通过属性注入。