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)); }