public static void Add(CacheBaseItem item, object value)
        {
            item.OnBeingAddedIntoCache();
            CacheManager.Cache.Add(
                item.Key,
                value,
                item.Dependencies,
                item.AbsoluteExpiration,
                item.SlidingExpiration,
                item.Priority,
                (k, v, reason) =>
            {
                if (_isDiagnosing)
                {
                    lock (_hits)
                    {
                        _hits.Remove(k);
                    }
                }

                if (item.OnRemoveCallback != null)
                {
                    item.OnRemoveCallback.Invoke(k, v, reason);
                }
            });
        }
        public static bool TryGetValue <T>(CacheBaseItem item, out T v)
        {
            var key = item.Key;

            if (!Get <T>(key, out v))
            {
                return(false);
            }
            else
            {
                if (_isDiagnosing)
                {
                    lock (_hits)
                    {
                        int keyValue;
                        if (_hits.TryGetValue(key, out keyValue))
                        {
                            _hits[key] = keyValue + 1;
                        }
                        else
                        {
                            _hits[key] = 1;
                        }
                    }
                }
                return(true);
            }
        }
        public static T Get <T>(CacheBaseItem item, Func <T> buildObject)
        {
            var key = item.Key;
            T   v;

            if (!Get <T>(key, out v))
            {
                v = buildObject();
                if (v != null)
                {
                    Add(item, v);

                    if (_isDiagnosing)
                    {
                        lock (_hits)
                        {
                            _hits[key] = 0;
                        }
                    }
                }
                else
                {
                    _logger.Warn("Performance hits. Cache missed and failed to create the object for cachekey: " + key);

                    if (_isDiagnosing)
                    {
                        lock (_hits)
                        {
                            int keyValue;
                            if (_hits.TryGetValue(key, out keyValue))
                            {
                                if (keyValue >= 0)
                                {
                                    // This sure rarely happen
                                    _hits[key] = -1;
                                }
                                else
                                {
                                    _hits[key] = keyValue - 1;
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                if (_isDiagnosing)
                {
                    lock (_hits)
                    {
                        int keyValue;
                        if (_hits.TryGetValue(key, out keyValue))
                        {
                            _hits[key] = keyValue + 1;
                        }
                        else
                        {
                            _hits[key] = 1;
                        }
                    }
                }
            }

            return(v);
        }
 public static object Remove(CacheBaseItem item)
 {
     return(Remove(item.Key));
 }