为了方便,没使用redis之类的nosql做缓存,直接选择了IMemoryCache
1.Startup
public void ConfigureServices(IServiceCollection services)
{
services.AddMemoryCache();
}
2.基类
using Microsoft.Extensions.Caching.Memory;
public class BaseApi : ControllerBase
{
protected OutputParm Result = new OutputParm();
protected IMemoryCache _cache;
/// <summary>
/// 构造函数 保证其他不使用缓存的接口正常使用
/// </summary>
protected BaseApi()
{
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="cache"></param>
protected BaseApi(IMemoryCache cache)
{
_cache = cache;
}
/// <summary>
/// 缓存扩展
/// </summary>
/// <param name="parm">InputParm 接口参数</param>
/// <param name="func">Func<InputParm(传入参数类型), OutputParm(返回参数类型)> 接口方法</param>
/// <param name="cacheTimeSpan">缓存绝对时间,默认60秒</param>
/// <returns></returns>
protected OutputParm Cache(InputParm parm, Func<InputParm, OutputParm> func,double cacheTimeSpan = 60)
{
//获取路由方法名
string FuncName = RouteData.Values["action"].ToString();
//根据方法名和参数值拼装关键字
string cacheKey = FuncName;
foreach (var item in parm.parms)
{
cacheKey += "_"+ item.value;
}
//获取缓存
var result = _cache.Get<OutputParm>(cacheKey);
if (result == null)
{
//执行方法获取数据
result = func?.Invoke(parm);
//存入缓存
_cache.Set(cacheKey, result, TimeSpan.FromSeconds(cacheTimeSpan));
}
return result;
}
}
3.ApiController
[Route("zt/")]
[ApiController]
public class ZtApi : BaseApi
{
private readonly ZtService ztserver;
public ZtApi(ZtService _u, IMemoryCache cache) : base(cache)
{
ztserver = _u;
}
#region 首页
/// <summary>
/// 首页
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
[HttpPost, Route("index")]
public OutputParm index(InputParm parm)
{
if (!ExcuteToken(parm)) return Result;//验证token无视
return Cache(parm, ztserver.Index);
}
#endregion
}
注释很清楚了,方便自己以后套用。。。