/ListenTo.Core.Caching/XmlConfiguredCacheResultAdvice.cs

https://github.com/listentorick/ListenTo
C# | 138 lines | 104 code | 33 blank | 1 comment | 17 complexity | af642d87969d7da95ee330f3e289a160 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using AopAlliance.Intercept;
  6. using System.Collections;
  7. using Spring.Aop.Framework.DynamicProxy;
  8. using Spring.Caching;
  9. using Spring.Expressions;
  10. using System.IO;
  11. namespace ListenTo.Core.Caching
  12. {
  13. public class XmlConfiguredCacheResultAdvice: BaseXmlConfiguredCacheAdvice, IMethodInterceptor
  14. {
  15. #region IMethodInterceptor Members
  16. public string GenerateKey(IMethodInvocation invocation){
  17. return invocation.Method.Name;
  18. }
  19. public object Invoke(IMethodInvocation invocation)
  20. {
  21. ObjectDefinition objDefinition = GetObjectDefinitonToAdvise(invocation.Target);
  22. bool requiresInvoke = true;
  23. object result = null;
  24. if (objDefinition != null)
  25. {
  26. MethodDefinition methodDefinition = GetMethodDefinition(objDefinition, invocation.Method.Name);
  27. if (methodDefinition != null)
  28. {
  29. IDictionary vars = PrepareVariables(invocation.Method, invocation.Arguments);
  30. object key = methodDefinition.KeyExpression.GetValue(null, vars);
  31. //do we need to set any caches?
  32. ICache cacheToReset = null;
  33. if (methodDefinition.ResetsCache != null)
  34. {
  35. foreach (string cacheName in methodDefinition.ResetsCache)
  36. {
  37. cacheToReset = this.GetCache(cacheName);
  38. cacheToReset.Clear();
  39. }
  40. }
  41. ICache cache = GetResultCacheForMethod(methodDefinition);
  42. if (cache != null)
  43. {
  44. result = cache.Get(key);
  45. if (result == null)
  46. {
  47. result = invocation.Proceed();
  48. cache.Insert(key, result);
  49. }
  50. requiresInvoke = false;
  51. }
  52. }
  53. }
  54. if (requiresInvoke)
  55. {
  56. result = invocation.Proceed();
  57. }
  58. return result;
  59. }
  60. private Dictionary<object, string> _objectsToAdvise;
  61. public ICache GetResultCacheForMethod(MethodDefinition methodDefinition)
  62. {
  63. string cacheName = methodDefinition.StoresInCache;
  64. return this.GetCache(cacheName);
  65. }
  66. public MethodDefinition GetMethodDefinition(ObjectDefinition objectDefinition, string method)
  67. {
  68. MethodDefinition result = null;
  69. foreach (MethodDefinition methodDefinition in objectDefinition.MethodDefinitions)
  70. {
  71. if (methodDefinition.Name == method)
  72. {
  73. result = methodDefinition;
  74. break;
  75. }
  76. }
  77. return result;
  78. }
  79. public ObjectDefinition GetObjectDefinitonToAdvise(object target)
  80. {
  81. ObjectDefinition result = null;
  82. object objectFromContext = null;
  83. if (this._objectsToAdvise == null)
  84. {
  85. this._objectsToAdvise = new Dictionary<object, string>();
  86. foreach(ObjectDefinition obj in this.CacheDefinition.Objects){
  87. BaseCompositionAopProxy proxy = (BaseCompositionAopProxy)this.GetObject(obj.Target);
  88. objectFromContext = proxy.m_targetSourceWrapper.GetTarget();
  89. this._objectsToAdvise[proxy.m_targetSourceWrapper.GetTarget()] = obj.Target;
  90. }
  91. }
  92. string objectId = this._objectsToAdvise[target];
  93. foreach (ObjectDefinition objDefinition in this.CacheDefinition.Objects)
  94. {
  95. if (objDefinition.Target == objectId)
  96. {
  97. result = objDefinition;
  98. break;
  99. }
  100. }
  101. return result;
  102. }
  103. #endregion
  104. }
  105. }