コード例 #1
0
        /// <summary>
        /// Cache item with given Func&lt;object>
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <param name="cacheFunction"></param>
        /// <param name="interval"></param>
        /// <param name="dependencies"></param>
        /// <param name="priority"></param>
        /// <param name="removalCallback"></param>
        /// <param name="settings"></param>
        /// <returns></returns>
        public virtual T CacheItem <T>(string key, Func <object> cacheFunction, double interval = 30, ICacheDependency dependencies = null,
                                       CachePriority priority = CachePriority.Default, Action <string, object, CacheRemovalReason> removalCallback = null, ICacheSettings settings = null)
        {
            if (cacheFunction == null)
            {
                return(default(T));
            }

            settings = settings ?? Settings;
            bool cacheEnabled = settings.Enabled;

            // Handle Structs
            if (_ReflectionHelper.IsValueType(typeof(T)))
            {
                // Boxing needed to avoid nullable checks on structs
                object o           = GetCrossPlatformCacheData(key);
                T      cachedValue = default(T);

                if (o != null)
                {
                    cachedValue = (T)o;
                }

                // !EnableCache allows previewing to disable per user
                if (!cacheEnabled || o == null)
                {
                    cachedValue = (T)cacheFunction();

                    if (cacheEnabled && interval > 0)
                    {
                        SetCrossPlatformCache(key, cachedValue, interval, dependencies, priority, removalCallback);
                    }
                }

                return(cachedValue);
            }

            // Handle Classes
            var cachedData = GetCrossPlatformCacheData(key);

            // !EnableCache allows previewing to disable per user
            if (!cacheEnabled || cachedData == null)
            {
                cachedData = cacheFunction();

                // If cached data is bad, store for a minute.
                if (cachedData == null)
                {
                    interval   = 60;
                    cachedData = new NullData();
                }

                if (cacheEnabled && interval > 0)
                {
                    SetCrossPlatformCache(key, cachedData, interval, dependencies, priority, removalCallback);
                }
            }

            return((cachedData is NullData) ? default(T) : (T)cachedData);
        }