You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.
using Admin.Core.Common ;
using Castle.DynamicProxy ;
using System.Linq ;
namespace Admin.Core.Extensions
{
/// <summary>
/// 面向切面的缓存使用
/// </summary>
public class AdminCacheAOP : CacheAOPbase
{
//通过注入的方式,把缓存操作接口通过构造函数注入
private readonly ICaching _cache ;
public AdminCacheAOP ( ICaching cache )
{
_cache = cache ;
}
//Intercept方法是拦截的关键所在, 也是IInterceptor接口中的唯一定义
public override void Intercept ( IInvocation invocation )
{
var method = invocation . MethodInvocationTarget ? ? invocation . Method ;
//对当前方法的特性验证
//如果需要验证
var CachingAttribute = method . GetCustomAttributes ( true ) . FirstOrDefault ( x = > x . GetType ( ) = = typeof ( CachingAttribute ) ) ;
if ( CachingAttribute is CachingAttribute qCachingAttribute )
{
//获取自定义缓存键
var cacheKey = CustomCacheKey ( invocation ) ;
//根据key获取相应的缓存值
var cacheValue = _cache . Get < string > ( cacheKey ) ;
if ( cacheValue ! = null )
{
//将当前获取到的缓存值,赋值给当前执行方法
invocation . ReturnValue = cacheValue ;
return ;
}
//去执行当前的方法
invocation . Proceed ( ) ;
//存入缓存
if ( ! string . IsNullOrWhiteSpace ( cacheKey ) )
{
_cache . Set ( cacheKey , invocation . ReturnValue , qCachingAttribute . AbsoluteExpiration ) ;
}
}
else
{
invocation . Proceed ( ) ; //直接执行被拦截方法
}
}
}
}