Exemplo n.º 1
0
        /// <summary>
        /// 设置缓存项的值。
        /// </summary>
        /// <param name="key">缓存项的原始键值。</param>
        /// <param name="value">缓存项的值。</param>
        /// <param name="methodName">调用当前的方法的方法名称。</param>
        /// <param name="expiration">缓存项的过期信息实例对象:<c>null</c> 表示滑动十分钟过期。</param>
        protected void SetValue(string key, object value, string methodName, Expiration expiration)
        {
            if (ReferenceEquals(key, null))
            {
                throw new ArgumentNullException("[BaseCacheContainer].[SetValue].key");
            }

            if (ReferenceEquals(value, null))
            {
                return;
            }

            expiration = expiration ?? Expiration.CreateInstance();
            if (expiration.Container != null && !ReferenceEquals(expiration.Container, this))
            {
                throw new ArgumentException("[BaseCacheContainer].[SetValue].expiration.Container 已存在,不能添加!");
            }
            expiration.Container = this;

            var notification = expiration.Notification ?? CacheNotification.CreateInstance();

            notification.Key = key;
            notification.SetValue(value, false);

            if (notification.Expiration != null && !ReferenceEquals(notification.Expiration, expiration))
            {
                throw new ArgumentException("[BaseCacheContainer].[SetValue].expiration.[Notification].Expiration 已存在,过期对象处理错误!");
            }
            notification.Expiration = expiration;

            Push(GetKey(key), methodName, expiration);
        }
Exemplo n.º 2
0
        /// <summary>
        /// 将缓存项保存到缓存容器中。
        /// </summary>
        /// <param name="cacheItemKey">用于缓存项的键名称。</param>
        /// <param name="methodName">用户调用的原始方法名称:Add 或者 Update</param>
        /// <param name="expiration">与之关联的缓存过期信息。</param>
        protected override void Push(string cacheItemKey, string methodName, Expiration expiration)
        {
            var absoluteExpiration = !expiration.AutoDelay ? expiration.DeadTime : Cache.NoAbsoluteExpiration;
            var slidingExpiration  = expiration.AutoDelay ? (expiration.DeadTime - expiration.InitialTime) : Cache.NoSlidingExpiration;

            if (methodName == "Add")
            {
                var obj = _cache.Add(cacheItemKey, expiration.Notification.Value, null, absoluteExpiration, slidingExpiration, CacheItemPriority.Normal, null);
                if (!ReferenceEquals(obj, null))
                {
                    throw new InvalidOperationException(string.Format("已存在相同键【{0}】的项!", expiration.Notification.Key));
                }
            }
            else
            {
                _cache.Insert(cacheItemKey, expiration.Notification.Value, null, absoluteExpiration, slidingExpiration, CacheItemPriority.Normal, null);
            }

            expiration.Notification.SetValue(CacheNotification.DefaultValue, false);
        }
Exemplo n.º 3
0
 /// <summary>
 /// 将缓存项保存到缓存容器中。
 /// </summary>
 /// <param name="cacheItemKey">用于缓存项的键名称。</param>
 /// <param name="methodName">用户调用的原始方法名称:Add 或者 Update</param>
 /// <param name="expiration">与之关联的缓存过期信息。</param>
 protected abstract void Push(string cacheItemKey, string methodName, Expiration expiration);
Exemplo n.º 4
0
 /// <summary>
 /// 更新指定键的值。
 /// </summary>
 /// <param name="key">缓存项的键。</param>
 /// <param name="value">缓存项新的值。</param>
 /// <param name="expiration">缓存项的过期设置信息:<c>null</c> 表示滑动十分钟过期。</param>
 public void Update(string key, object value, Expiration expiration = null)
 {
     SetValue(key, value, "Update", expiration);
 }
Exemplo n.º 5
0
 /// <summary>
 /// 向缓存容器中添加一个新的项。
 /// </summary>
 /// <param name="key">缓存项的键。</param>
 /// <param name="value">待缓存的值。</param>
 /// <param name="expiration">缓存项的过期设置信息,<c>null</c> 表示滑动十分钟过期。</param>
 public void Add(string key, object value, Expiration expiration = null)
 {
     SetValue(key, value, "Add", expiration);
 }
Exemplo n.º 6
0
        /// <summary>
        /// 根据指定键获取或添加指定值。
        /// </summary>
        /// <typeparam name="TResult">缓存容器值的强类型表示。</typeparam>
        /// <param name="container">一个缓存容器接口的实例对象。</param>
        /// <param name="key">缓存项的键。</param>
        /// <param name="newValue">获取失败后待添加的新值。</param>
        /// <param name="expiration">缓存项的过期设置信息:<c>null</c> 表示使用缺省的过期设置。</param>
        /// <returns>获取得到的缓存项的值。</returns>
        /// <exception cref="System.ArgumentNullException">container or key or newValue</exception>
        public static TResult GetOrAddX <TResult>(this ICacheContainer container, string key, TResult newValue, Expiration expiration = null)
        {
            if (ReferenceEquals(container, null))
            {
                throw new ArgumentNullException(string.Format("[ICacheContainerExtensions].[GetOrAddX<{0}>].container", typeof(TResult).FullName));
            }
            if (key == null)
            {
                throw new ArgumentNullException(string.Format("[ICacheContainerExtensions].[GetOrAddX<{0}>].key", typeof(TResult).FullName));
            }
            if (newValue == null)
            {
                throw new ArgumentNullException(string.Format("[ICacheContainerExtensions].[GetOrAddX<{0}>].newValue", typeof(TResult).FullName));
            }

            object value = null;

            if (container.TryGetValue(key, out value))
            {
                return((TResult)value);
            }

            container.Update(key, newValue, expiration);
            return(newValue);
        }
Exemplo n.º 7
0
        /// <summary>
        /// 根据指定键获取或添加指定值。
        /// </summary>
        /// <param name="container">一个缓存容器接口的实例对象。</param>
        /// <param name="key">缓存项的键。</param>
        /// <param name="newValue">获取失败后待添加的新值。</param>
        /// <param name="expiration">缓存项的过期设置信息:<c>null</c> 表示使用缺省的过期设置。</param>
        /// <returns>获取得到的缓存项的值。</returns>
        /// <exception cref="System.ArgumentNullException">container or key or newValue</exception>
        public static object GetOrAdd(this ICacheContainer container, string key, object newValue, Expiration expiration = null)
        {
            if (ReferenceEquals(container, null))
            {
                throw new ArgumentNullException("[ICacheContainerExtensions].[GetOrAdd].container");
            }
            if (key == null)
            {
                throw new ArgumentNullException("[ICacheContainerExtensions].[GetOrAdd].key");
            }

            object value = null;

            if (container.TryGetValue(key, out value))
            {
                return(value);
            }

            container.Update(key, newValue, expiration);
            return(newValue);
        }