面向方法的数据集缓存
使用了 autofac 做为 IoC 容器, 使用 Autofac.Extras.DynamicProxy2 作为方法拦截器, 缓存面向方法, 直接在方法上添加 CachingAttribute 特性即可.
缓存注册流程
关于方法拦截器
缓存名称设计
添加 IoC
添加拦截器与接口的绑定
在对应的接口实现类里, 为方法添加 CachingAttribute
缓存 get,remove 的作用
关于方法拦截器
方法拦截器是 AOP 面向方面编程的一个重要体现, 将我们的功能点设计出现, 与现有系统解耦, 然后注入到项目里, 哪些地方需要这个功能, 就在哪个地方注入它.
AOP 是以 IoC 容器为基础的, 所以你的拦截器组件也需要提前被注入到 IoC容器里, 并且, 现在不论是 java 还是. net, 都提倡统一管理对象, 而不是用 new 来生产对象, 这一点也是面向接口编程的一种体现, 而你在业务层进行对象传递时, 永远依赖的是抽象, 而不会依赖具体的实现!
缓存名称设计
名称由 key 和 value 组成
key: 项目名 + 对象名 + 缓存名称 (CachingAttribute.key)
value: 缓存方法的参数名 + 参数值的组合
例如下面的缓存方法代码
- [Caching(CachingMethod.Get, value = "time")]
- DateTime GetTime(int id);
当调用为 GetTime(1) 时, 产生的缓存 key 值如下:
- key="DataSetCache_IUserInfoService_time"
- value="id_1"
添加 IoC
- builder.RegisterType<CachingBehavior>();
- builder.RegisterType<DefaultUserInfoService>()
- .As<IUserInfoService>()
- .InstancePerLifetimeScope()
- .InterceptedBy(typeof(CachingBehavior))
- .EnableInterfaceInterceptors();
添加拦截器与接口的绑定
- // 下面两句表示将 CachingBehavior 拦截器绑定到接口上
- .InterceptedBy(typeof(CachingBehavior))
- .EnableInterfaceInterceptors();
在方法上添加 CachingAttribute 特性
- [Caching(CachingMethod.Get,value="time")]
- DateTime GetTime();
我们可以在接口的方法上添加这个特性, 也可以在接口的实现类的方法上添加这个特性, 根据缓存的影响程度去添加. 如果缓存对接口所有实现都启作用, 就放在接口方法上, 反之放在类的方法上.
缓存 get,remove 的作用
get: 一般作用在带有返回值的方法上, 缓存名称为项目名 + 类名 + value, 当缓存存在时, 直接返回, 当不存在时, 执行方法后, 把返回值存入缓存, 再返回.
remove: 删除某个缓存, 它直接把缓存名称 value 作为 remove 的参数注入.
来源: http://blog.51cto.com/14230003/2443711