ABP框架学习记录(11)- 缓存的实现
ABP框架学习记录(11)- 缓存的实现
缓存在 ABP 项目中的路径 ABP/Runtime:

ABP中实现两种 Cache :MemroyCache 和 RedisCache。两者都继承至 ICache 接口(准确说是 CacheBase 抽象类)。ABP核心模块封装了 MemroyCache 来实现ABP中的默认缓存功能。 Abp.RedisCache 这个模块封装 RedisCache 来实现缓存(通过 StackExchange.Redis 这个类库访问redis)
ICache 接口:定义可以按键存储和获取项目的缓存。

ICache 接口中的方法 Get/GetAsync 有两个参数:
key:缓存关键字,字符串类型;
工厂:没有找到指定key的缓存条目时调用传入的action来创建cache。工厂方法应该创建并返回实际的条目。如果给定的key在缓存中找到了,那么不会调用该action。

CacheBase:提供继承 ICache 接口的抽象类;

CacheExtensions:提供 ICache的扩展类:

ICacheManager/CacheManagerBase:提供缓存管理器;

ICacheManager.GetCache 方法返回一个ICache。第一次请求时会创建缓存,并通过 CachingConfiguration 中的CacheConfigurator 完成对该Cache的配置,以后都是返回相同的缓存对象。因此,我们可以在不同的类(客户端)中共享具有相同名字的相同缓存。

ICachingConfiguration/CachingConfiguration:用于配置 缓存系统,首先通过在 AbpKernelModule 类,PreInitialize 方法配置缓存:

定义:


ICacheConfigurator/CacheConfigurator:表示已注册的缓存配置器,定义两个构造函数,其中的参数 Action<ICache> initAction 表示创建的回调函数;

在 AbpKernelModule 类,PreInitialize 方法调用:

CacheManagerExtensions:提供对 CacheManager 扩展类,提供 GetCache<TKey, TValue> 方法,具体实现调用 CacheExtensions 的 AsTyped<TKey, TValue> 扩展方法;


AsTyped<TKey, TValue> 扩展方法,实例化了一个 TypedCacheWrapper<TKey, TValue>(cache) 类型的对象,并将 CacheManagerExtensions 中扩展方法 GetCache<TKey, TValue> 的 TKey, TValue,然后继续传递给 CacheExtensions 中的扩展方法 AsTyped<TKey, TValue> 的 TKey, TValue,最终,在 TypedCacheWrapper 的泛型类中接收,并为其自身的方法提供 TKey, TValue。

ITypedCache/TypedCacheWrapper/TypedCacheExtensions:支持泛型key和value的缓存接口与实现,其内部通过封装ICache实例和CacheExtension定义的对ICache的扩展方法来是实现泛型版本的 Icache。


AbpMemoryCacheManager :重写了 CacheManagerBase 的 CreateCacheImplementation 方法,该方法用于创建真实的 Icache 对象。 具体到 AbpMemoryCacheManager 就是创建 AbpMemoryCache。

AbpMemoryCache:通过CLR的 MemoryCache 来实现 Icache 。

使用

参考: