# 拦截器

具体代码可查看LessSharp.ServiceInterceptors目录下的类

框架使用了一个较为轻量级的AOP框架(AspectCore)实现拦截效果。具体实现原理可查看博客(Asp.net Core 3.1基于AspectCore实现AOP,实现事务、缓存拦截器)。以下为框架目前提供的拦截器,如果需要实现自定义拦截器,可在此目录下进行创建。

注意

拦截器只能拦截虚方法或实现接口的方法

# 事务拦截器

在需要实现事务统一性的方法上加上特性,即可自动实现事务

[TransactionInterceptor]
public virutal IActionResult Test12()
{
    var id = _userService.Save(new Dto.Sys.UserSaveDto{
        LoginName = "用户名",
        Role = -1
    })
    return Content(id.ToString());
}

# 缓存拦截器

[CacheInterceptor("Config")]//可传入一个缓存Key,如果不传Key,则以方法名称加类加命名空间做了Key
public virtual async Task<string> GetValueByKey(string key)
{
	return await this.DbQuery.Where(e => e.Key == Enum.Parse<ConfigKey>(key)).Select(e => e.Value).FirstOrDefaultAsync();
}

# 缓存删除拦截器

这个拦截器在方法执行完成后,会把对应的缓存进行清除,一般用于更新已缓存数据的方法上

[CacheDeleteInterceptor("Config","ConfigList")]//
public virtual async Task SaveAsync(List<ConfigDto> dtos)
{
	this.AutoSaveChanges = false;
	foreach (var d in dtos)
	{
		await this.UpdateAsync(d);
	}
	await this.DbContext.SaveChangesAsync();
}

# 方法缓存删除拦截器

这个拦截器跟上面缓存删除拦截器作用差不多,主要用于CacheInterceptor没传Key的情况,需传对数据相同的Types数组跟Methods方法名称数据

[MethodCacheDeleteInterceptor(new Type[] { typeof(ConfigService) }, new string[] { nameof(ConfigService.GetListAsync) })]
public virtual async Task SaveAsync(List<ConfigDto> dtos)
{
	this.AutoSaveChanges = false;
	foreach (var d in dtos)
	{
		await this.UpdateAsync(d);
	}
	await this.DbContext.SaveChangesAsync();
}
上次更新: 3/7/2021, 11:20:46 PM