/// <summary> /// 将对象放入缓存区。 /// </summary> /// <param name="key">用于之后检索出缓存对象的键名,必需是全局唯一的。</param> /// <param name="cachingObject">待放入缓存区的对象。</param> /// <param name="expiredPolicy">缓存到期策略。</param> public void Put(string key, object cachingObject, CacheExpiredPolicy expiredPolicy) { _cachedObjects[key] = new CachedObject() { CachingObject = cachingObject, ExpiredPolicy = expiredPolicy }; }
/// <summary> /// 从缓存区获得需要的数据,如果没有则通过 func 获得需要缓存的数据,并将其放入缓存区。 /// </summary> /// <typeparam name="T">需要缓存数据的类型。</typeparam> /// <param name="key">用于在缓存区寻找缓存对象的唯一键名。</param> /// <param name="func">用于获取需要缓存的数据。</param> /// <param name="expiredPolicy">缓存到期策略。</param> /// <returns>缓存的数据。</returns> /// <remarks> /// 通过该方法可以省掉获取与缓存数据的逻辑代码,只需要指定获取需要缓存数据的逻辑。 /// <example> /// 例如:下面的例子中,将 1 + 2 算的整数值放入缓存区,并从缓存区返回该计算的整数值。 /// 这样不用每次去计算 1 + 2 这个表达式,直到缓存到期策略判断缓存到期,才重新去计算并存入缓存区。 /// <code> /// int x = Cache.Instance.GetValue<int>("somekey", () => { /// return 1 + 2; /// }); /// </code> /// </example> /// </remarks> public T GetValue <T>(string key, Func <T> func, CacheExpiredPolicy expiredPolicy) { var cv = this.Get(key); if (cv != null) { return((T)cv); } var v = func(); this.Put(key, v, expiredPolicy); return(v); }