[Serializable]
public
class
CacheAspect : OnMethodBoundaryAspect
{
public
int
MethodCacheDurationInMinute = 0;
public
override
void
OnEntry(MethodExecutionArgs args)
{
var
cacheKey = CreateMD5(GenerateCacheKey(args));
var
cacheManager =
new
CacheManager();
var
isCacheKeyExist = cacheManager.Contains(cacheKey);
if
(isCacheKeyExist)
{
args.ReturnValue = cacheManager.Get(cacheKey);
args.FlowBehavior = FlowBehavior.Return;
}
else
{
args.MethodExecutionTag = cacheKey;
}
}
public
override
void
OnSuccess(MethodExecutionArgs args)
{
var
cacheKey = (
string
)args.MethodExecutionTag;
var
cacheManager =
new
CacheManager();
var
cacheModel =
new
CacheModel
{
CacheData = args.ReturnValue,
CacheTimeOutInfo = DateTime.Now.AddMinutes(MethodCacheDurationInMinute)
};
cacheManager.Add(cacheKey, cacheModel);
}
private
static
string
GenerateCacheKey(MethodExecutionArgs args)
{
var
generatedKey =
string
.Empty;
if
(args.Method.DeclaringType !=
null
)
generatedKey = args.Method.DeclaringType.Name +
"-"
+ args.Method.Name + (args.Arguments.Any() ?
"-"
+ args.Arguments.Aggregate((first, second) => first +
"-"
+ second) :
""
);
generatedKey += SerializeObjectToJson(args.Arguments);
return
generatedKey;
}
public
static
string
CreateMD5(
string
input)
{
using
(
var
md5 = System.Security.Cryptography.MD5.Create())
{
var
inputBytes = Encoding.ASCII.GetBytes(input);
var
hashBytes = md5.ComputeHash(inputBytes);
var
sb =
new
StringBuilder();
foreach
(
var
t
in
hashBytes)
{
sb.Append(t.ToString(
"X2"
));
}
return
sb.ToString();
}
}
}