2025-04-24 18:31:27 +08:00

76 lines
2.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Practices.Unity.InterceptionExtension;
using System.Transactions;
using System.Reflection;
using System.Web;
using MyCode.Project.Infrastructure.Cache;
using Microsoft.Practices.Unity;
using Newtonsoft.Json;
using MyCode.Project.Infrastructure.Common;
namespace MyCode.Project.Infrastructure.UnityExtensions
{
public class CachingCallHandler : ICallHandler
{
public TimeSpan ExpirationTime {
get;set;
}
#region GetCacheKey(key)
private string GetCacheKey(MethodInfo method, IMethodInvocation input)
{
StringBuilder sb = new StringBuilder();
sb.AppendFormat("{0}:", method.DeclaringType.FullName);
sb.AppendFormat("{0}:", method.Name);
if (input.Arguments != null && input.Arguments.Count > 0)
{
for (int i = 0; i < input.Arguments.Count; i++)
{
sb.Append(JsonHelper.ToJson(input.Arguments[i]));
}
}
return sb.ToString();
}
#endregion
#region Invoke()
public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
{
MethodInfo targetMethod = (MethodInfo)input.MethodBase;
if (targetMethod.ReturnType == typeof(void))
{
return getNext()(input, getNext);
}
var Cache = new SystemCache();
string CacheKey = GetCacheKey(targetMethod,input);
object cacheResult = Cache.Get(CacheKey) ;
if (null == cacheResult)
{
IMethodReturn realReturn = getNext()(input, getNext);
if (null == realReturn.Exception) {
Cache.Set(CacheKey, realReturn.ReturnValue, this.ExpirationTime);
}
return realReturn;
}
return input.CreateMethodReturn(cacheResult,input.Arguments);
}
#endregion
public CachingCallHandler(TimeSpan expirationtime)
{
this.ExpirationTime = expirationtime;
}
public int Order { get; set; }
}
}