public void BeforeInvoke(InvocationContext invocationContext) { _memoryCacheAttribute = invocationContext.GetAttributeFromMethod<MemoryCacheAttribute>(); var cacheKey = _memoryCacheAttribute.CacheKey; var cacheConfig = _cacheConfigFactory.Config[cacheKey]; if (cacheConfig.Enabled) { if (!string.IsNullOrWhiteSpace(_memoryCacheAttribute.CacheKeyParameterSubstitutions)) { List<object> paramValues = new List<object>(); string[] paramNames = _memoryCacheAttribute.CacheKeyParameterSubstitutions.Split(",", StringSplitOptions.RemoveEmptyEntries); foreach (string paramName in paramNames) { paramValues.Add(invocationContext.GetParameterValue(paramName.Trim())); } cacheKey = string.Format(cacheConfig.CacheKey.ToString(), paramValues.ToArray()); } CacheKey = cacheKey; if (_memoryCacheAttribute.RefreshCache) { _memoryCacheService.Remove(CacheKey); } var cacheReturnObj = RetrieveCacheEntry(invocationContext, CacheKey); if (cacheReturnObj != null && cacheReturnObj.CacheEntry != null) { var returnType = invocationContext.GetMethodReturnType(); var isAsyncMethod = returnType != null && returnType.IsGenericType && returnType.GetGenericTypeDefinition() == typeof(Task<>); if (isAsyncMethod) { invocationContext.OverrideAsyncMethodReturnValue(cacheReturnObj.CacheEntry); } else { invocationContext.OverrideMethodReturnValue(cacheReturnObj.CacheEntry); } invocationContext.TempData[CacheConstants.LOGGING_CACHE_INVOCATIONCONETXT] = string.Format( "{0}{1}{2}", CacheConstants.LOGGING_CACHE_HIT, CacheConstants.LOGGING_CACHE_DELIMITER, cacheKey); invocationContext.BypassInvocation(); } else { invocationContext.TempData[CacheConstants.LOGGING_CACHE_INVOCATIONCONETXT] = string.Format( "{0}{1}{2}", CacheConstants.LOGGING_CACHE_MISS, CacheConstants.LOGGING_CACHE_DELIMITER, cacheKey); } } }
private CacheReturnModel RetrieveCacheEntry(InvocationContext invocationContext, string key) { var cacheReturnObj = new CacheReturnModel(); try { var returnType = invocationContext.GetMethodReturnType(); cacheReturnObj.CacheEntry = IsReturnTypeGenericCollection(returnType) ? RetrieveCollectionFromCache(key, returnType) : _memoryCacheService.Get(key); } catch (Exception ex) { cacheReturnObj.CacheContext = CreateCacheExceptionInfoMessage(key, ex); } return cacheReturnObj; }