[Abp 源码分析]八、缓存管理 (3)

缓存配置的作用就是可以为每个缓存配置不同的过期时间,我们最开始说过 Abp 是通过 ICachingConfiguration 来配置缓存的,在这个接口里面呢定义了这样几个东西。

public interface ICachingConfiguration { // 配置项集合 IReadOnlyList<ICacheConfigurator> Configurators { get; } // 配置所有缓存 void ConfigureAll(Action<ICache> initAction); // 配置指定名称的缓存 void Configure(string cacheName, Action<ICache> initAction); }

Emmmm,可以看到他有个 Configurators 属性存了一大堆 ICacheConfigurator ,这个玩意儿呢就是对应到具体缓存的配置项了。

public interface ICacheConfigurator { // 关联的缓存名称 string CacheName { get; } // 缓存初始化的时候执行的配置操作 Action<ICache> InitAction { get; } }

这玩意儿的实现也没什么好看的,跟接口差不多,这下我们知道了缓存的配置呢就是存放在 Configurators 里面的。

然后呢,就在我们最开始的地方,缓存管理器创建缓存的时候不是根据名字去遍历这个 Configurators 集合么,在那里面就直接通过这个 ICacheConfigurator 的 Action<ICache> 来配置缓存的超期时间。

至于 Configure() 和 ConfigureAll() 方法嘛,前者就是根据你传入的缓存名称初始化一个 CacheConfigurator ,然后扔到那个列表里面去。

private readonly List<ICacheConfigurator> _configurators; public void Configure(string cacheName, Action<ICache> initAction) { _configurators.Add(new CacheConfigurator(cacheName, initAction)); }

后者的话则是添加了一个没有名字的 CacheConfigurator ,正因为没有名字,所以他的 cacheName 肯定 null,也就是在缓存管理器创建缓存的时候如果该缓存没有对应的配置,那么就会使用这个名字为空的 CacheConfigurator 了。

2.4 强类型缓存

在最开始的使用方法里面可以看到我们通过 AsType<TKey,TValue>() 方法将 ICache 对象转换为 ITypedCache ,这样我们就无需再将缓存项手动进行强制类型转换。

注:虽然这里是指定了泛型操作,但是呢,在其内部实现还是进行的强制类型转换,也是会发生装/拆箱操作的。

[Abp 源码分析]八、缓存管理

Abp 自己则通过 TypedCacheWrapper<TKey, TValue> 来将原有的 ICache 缓存包装为 ITypedCache<TKey, TValue>。

看看这个扩展方法的定义,他是放在 CacheExtensions 里面的:

public static ITypedCache<TKey, TValue> AsTyped<TKey, TValue>(this ICache cache) { return new TypedCacheWrapper<TKey, TValue>(cache); }

Emmm,这里是 new 了一个 TypedCacheWrapper 来处理的,从方法定义可以看出来 TypedCacheWrapper 是 ITypedCache 的一个默认实现。

ITypedCache<TKey,TValue> 拥有 ICache 的所有方法签名,所以使用 ITypedCache<TKey,TValue> 与使用 ICache 的方式是一样的。

TypedCacheWrapper 的各种方法其实就是调用的传入的 ICache 对象的方法,只不过在返回值得时候他自己进行了强制类型转换而已,比如说,看看他的 Get 方法。

public class TypedCacheWrapper<TKey, TValue> : ITypedCache<TKey, TValue> { // 返回的是内部 ICache 的名称 public string Name { get { return InternalCache.Name; } } public TimeSpan DefaultSlidingExpireTime { get { return InternalCache.DefaultSlidingExpireTime; } set { InternalCache.DefaultSlidingExpireTime = value; } } public TimeSpan? DefaultAbsoluteExpireTime { get { return InternalCache.DefaultAbsoluteExpireTime; } set { InternalCache.DefaultAbsoluteExpireTime = value; } } // 调用 AsTyped() 方法时候传入的 ICache 对象 public ICache InternalCache { get; private set; } public TypedCacheWrapper(ICache internalCache) { InternalCache = internalCache; } // 调用的是一个 ICache 的扩展方法 public TValue Get(TKey key, Func<TKey, TValue> factory) { return InternalCache.Get(key, factory); } // ..... 忽略了其他方法 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwjypx.html