Example #1
0
		public void Delete(EventInformation eventInformation)
		{
			lock (lockObject(eventInformation))
			{
					cache.Remove(eventInformation.CacheKey);
			}
		}
Example #2
0
		private object interceptUsingCache(MethodInfo method, object[] arguments)
		{
			var keyAndItsDependingKeys = _configurationForType.CacheKey.GetAndPutKey(_configurationForType.ComponentType, _cachingComponent, method, arguments);
			if (keyAndItsDependingKeys.Key == null)
				return callOriginalMethod(method, arguments);

			var eventInformation = new EventInformation(keyAndItsDependingKeys.Key, _configurationForType.ComponentType.ConfiguredType, method, arguments);
			return _cache.GetAndPutIfNonExisting(eventInformation, keyAndItsDependingKeys.DependingRemoveKeys, () => callOriginalMethod(method, arguments));
		}
Example #3
0
		private CachedItem executeAndPutInCache(EventInformation eventInformation, IEnumerable<string> dependingRemoveKeys, Func<object> originalMethod)
		{
			var methodResult = originalMethod();
			var cachedItem = new CachedItem(eventInformation, methodResult);
			var key = cachedItem.EventInformation.CacheKey;
			var dependedKeys = dependingRemoveKeys.ToList();
			dependedKeys.Add(mainCacheKey);
			createDependencies(dependedKeys);

			var policy = new CacheItemPolicy
			{
				AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(_timeoutMinutes),
				RemovedCallback = arguments => _eventListenersCallback.OnCacheRemoval(cachedItem)
			};
			policy.ChangeMonitors.Add(cache.CreateCacheEntryChangeMonitor(dependedKeys));
			cache.Set(key, cachedItem, policy);
			return cachedItem;
		}
Example #4
0
		public void Intercept(IInvocation invocation)
		{
			if (!_configurationForType.EnabledCache)
			{
				invocation.Proceed();
				return;
			}

			var method = invocation.Method;
			//ugly hack
			if (method.IsGenericMethod && !_configurationForType.CachedMethods.Contains(method, MethodInfoComparer.Instance))
			{
				invocation.Proceed();
				return;
			}
			var proxy = (ICachingComponent)invocation.Proxy;
			var arguments = invocation.Arguments;

			var keyAndItsDependingKeys = _configurationForType.CacheKey.GetAndPutKey(_configurationForType.ComponentType, proxy, method, arguments);
			if (keyAndItsDependingKeys.Key == null)
			{
				invocation.Proceed();
			}
			else
			{
				var eventInfo = new EventInformation(keyAndItsDependingKeys.Key, _configurationForType.ComponentType.ConfiguredType, invocation.Method, invocation.Arguments);
				var hasCalledOriginalMethod = false;
				var result = _cache.GetAndPutIfNonExisting(eventInfo, keyAndItsDependingKeys.DependingRemoveKeys, () =>
					{
						invocation.Proceed();
						hasCalledOriginalMethod = true;
						return invocation.ReturnValue;
					});
				if (!hasCalledOriginalMethod)
				{
					invocation.ReturnValue = result;
				}
			}
		}
Example #5
0
		public CachedItem GetAndPutIfNonExisting(EventInformation eventInformation, Func<IEnumerable<string>> dependingRemoveKeys, Func<object> originalMethod)
		{
			var cachedItem = (CachedItem)cache.Get(eventInformation.CacheKey);
			if (cachedItem != null)
			{
				_eventListenersCallback.OnCacheHit(cachedItem);
				return cachedItem;
			}

			lock (lockObject(eventInformation))
			{
				var cachedItem2 = (CachedItem)cache.Get(eventInformation.CacheKey);
				if (cachedItem2 != null)
				{
					_eventListenersCallback.OnCacheHit(cachedItem2);
					return cachedItem2;
				}
				var addedValue = executeAndPutInCache(eventInformation, dependingRemoveKeys(), originalMethod);
				_eventListenersCallback.OnCacheMiss(addedValue);
				return addedValue;
			}
		}
 void IEventListener.OnGetUnsuccessful(EventInformation eventInformation)
 {
     Interlocked.Increment(ref _cacheMisses);
 }
Example #7
0
		public CachedItem(EventInformation eventInformation, object cachedValue)
		{
			EventInformation = eventInformation;
			CachedValue = cachedValue;
		}
Example #8
0
 public void OnGetUnsuccessful(EventInformation eventInformation)
 {
     log.DebugFormat(cacheMissLogMessage, eventInformation.MethodName(), eventInformation.CacheKey);
 }
Example #9
0
		public void Delete(EventInformation eventInformation)
		{
			if (eventInformation.CacheKey == null)
				return;
			_cache.Delete(eventInformation);
		}
Example #10
0
		public object GetAndPutIfNonExisting(EventInformation eventInformation, Func<IEnumerable<string>> dependingRemoveKeys, Func<object> originalMethod)
		{
			var cachedItem = _cache.GetAndPutIfNonExisting(eventInformation, dependingRemoveKeys, originalMethod);
			return cachedItem?.CachedValue;
		}
Example #11
0
		private object lockObject(EventInformation eventInformation)
		{
			return _lockObjectGenerator.GetFor(eventInformation.Type.FullName);
		}