Пример #1
0
        /// <summary>
        /// Gets an object from the cache or creates it if it doesnt exist
        /// </summary>
        /// <param name="key">key to item</param>
        /// <param name="expire">Expire this item after this much time.  -1 for NEVER</param>
        /// <param name="f">Factory method if key doesnt exist</param>
        /// <returns></returns>
        public object Get(string key, TimeSpan expire, Func <object> f)
        {
            CacheItem item = backend.Get(key);

            if (item == null)
            {
                if (f != null)
                {
                    object val = f();
                    item = new CacheItem(key, val);

                    // anything less than 0 is NEVER
                    if (expire.Ticks < 0)
                    {
                        item.Stats.Expire = DateTime.MaxValue;
                    }
                    else
                    {
                        item.Stats.Expire = item.Stats.Created + expire;
                    }
                    backend.Set(item);
                }
            }
            if (item == null)
            {
                return(null);
            }

            // item is expired..
            if (item.Stats.Expire <= DateTime.Now)
            {
                // recreate it..
                if (f != null)
                {
                    object val = f();
                    item = new CacheItem(key, val);
                    backend.Set(item);
                }
            }

            // anything less than 0 is NEVER
            if (expire.Ticks < 0)
            {
                item.Stats.Expire = DateTime.MaxValue;
            }
            else
            {
                item.Stats.Expire = item.Stats.Created + expire;
            }

            // update access statistics for the item
            backend.Touch(item);
            return(item.Value);
        }