public CachedObject <TResult> GetItem <TResult>(ProxyRequest <T, TResult> proxyRequest, CachePolicy cachePolicy)
        {
            var key = proxyRequest.CreateHash();

            object value;

            if (_client.TryGet(key, out value))
            {
                var cachedObject = value as MemcachedObject <TResult>;
                if (cachedObject == null)
                {
                    return(new CachedObject <TResult>(CachedObjectState.None, null));
                }

                if (cachedObject.IsException && cachedObject.Created.AddSeconds(cachePolicy.ExceptionCacheDuration) > DateTime.Now)
                {
                    return(new CachedObject <TResult>(CachedObjectState.Exception, cachedObject.Exception));
                }
                else if (cachedObject.IsException)
                {
                    return(new CachedObject <TResult>(CachedObjectState.None, null));
                }

                var fresh = cachedObject.Created.AddSeconds(cachePolicy.CacheDuration) > DateTime.Now;
                var state = fresh ? CachedObjectState.Fresh : CachedObjectState.Stale;
                return(new CachedObject <TResult>(state, cachedObject.Object));
            }

            return(new CachedObject <TResult>(CachedObjectState.None, null));
        }
        public void Purge <TResult>(Expression <Func <T, TResult> > expression)
        {
            var methodInfo      = SymbolExtensions.GetMethodInfo(expression);
            var parameters      = SymbolExtensions.GetParameter(expression);
            var proxyExpression = new ProxyRequest <T, TResult>(methodInfo, parameters);

            var hash = proxyExpression.CreateHash();

            _client.Remove(hash);
        }
        public bool TryGetRaw <TResult>(ProxyRequest <T, TResult> proxyRequest, out object result)
        {
            var    key = proxyRequest.CreateHash();
            object value;

            if (_client.TryGet(key, out value))
            {
                var cachedObject = value as MemcachedObject <TResult>;
                if (cachedObject != null)
                {
                    result = cachedObject;
                    return(true);
                }
            }
            result = null;
            return(false);
        }
        public void StoreItem <TResult>(ProxyRequest <T, TResult> proxyRequest, CachePolicy cachePolicy, TResult item)
        {
            var key          = proxyRequest.CreateHash();
            var cachedObject = new MemcachedObject <TResult>()
            {
                Created = DateTime.Now,
                Object  = item
            };

            if (cachePolicy.MaxAge > 0)
            {
                _client.Store(StoreMode.Set, key, cachedObject, TimeSpan.FromSeconds(cachePolicy.MaxAge));
            }
            else
            {
                _client.Store(StoreMode.Set, key, cachedObject);
            }
        }
        public void StoreException <TResult>(ProxyRequest <T, TResult> proxyRequest, CachePolicy cachePolicy, Exception exception)
        {
            var key          = proxyRequest.CreateHash();
            var cachedObject = new MemcachedObject <TResult>()
            {
                Created     = DateTime.Now,
                IsException = true,
                Exception   = exception,
            };

            if (cachePolicy.MaxAge > 0)
            {
                _client.Store(StoreMode.Set, key, cachedObject, TimeSpan.FromSeconds(cachePolicy.MaxAge));
            }
            else
            {
                _client.Store(StoreMode.Set, key, cachedObject);
            }
        }