自定义特性+AOP实现缓存
2018-08-21 22:37:30摘要:1. 目标 如下代码:我们要实现缓存,但希望让使用者不用关心缓存的具体实现,只需要使用者在要操作缓存的方法上加上特性标注即可。 [Caching(CachingMethod.Remove, GetLinksQuery)] public class CreateLinkCommand { } [Caching(CachingMethod.Get)] public class GetLinksQuery : IRequestListLinkViewModel { } 要实现我们的目标,我们把任务分成2部分,首先实现缓存逻辑,然后将缓存基于特性做AOP实现。 2. 缓存实现 首先我们定义一个缓存接口 public interface ICacheProvider { /// summary /// 向缓存中添加一个对象。 /// /summary /// param name=key缓存的键值,该值通常是使用缓存机制的方法的名称。/param /// param name=valKey缓存值的键值,该值通常是由使用缓存机制的方法的参数值所产生。/param /// param name=value需要缓存的对象。/param void Add(string key, string valKey, object value); void Put(string key, string valKey, object value); object Get(string key, string valKey); void Remove(string key); bool Exists(string key); bool Exists(string key, string valKey); } 如上代码,为什么接口中key和valKey2个参数呢?这是因为我们可能会缓存同一个方法不同参数的结果,如在一个获取分页结果的方法中,我们可能会返回不同页的结果。如我们目标中GetLinksQuery方法缓存的值会是一个分页显示结果的字典。key是我们缓存的方法名,valKey这是缓存的字典结果中的字典key,value则是字典的结果。要进一步理解可以查看下面基于内存的…… 阅读全文