Exemple #1
0
        public override IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
        {
            Guard.ArgumentIsNotNull(input, "input");
            Guard.ArgumentIsNotNull(getNext, "getNext");

            var cacheKey = GenerateCacheKey(input);

            _logger.Write(string.Format("Fetching {0} from {1}", cacheKey, _cachingProvider.GetType()), TraceEventType.Information);

            var result = _cachingProvider.Retrieve <object>(cacheKey);

            if (result == null)
            {
                _logger.Write(string.Format("{0} doesn't exist in Cache. Continue execution pipeline.", cacheKey), TraceEventType.Information);
                var methodReturn = getNext().Invoke(input, getNext);

                if (methodReturn.Exception == null && methodReturn.ReturnValue != null)
                {
                    _logger.Write(string.Format("Inserting {0}, with key: {1} to {2}", methodReturn.ReturnValue, cacheKey, _cachingProvider.GetType()), TraceEventType.Information);
                    _cachingProvider.Insert(cacheKey, methodReturn.ReturnValue);
                }
                else
                {
                    _logger.Write(string.Format("Target {0} did not return a value, nothing to cache", input.Target), TraceEventType.Information);
                }

                return(methodReturn);
            }

            _logger.Write(string.Format("Object retrieved from {0}, value: {1}", _cachingProvider.GetType(), result), TraceEventType.Information);
            return(input.CreateMethodReturn(result));
        }