var task = myService.GetAllAsync();
这将运行
GetAllAsync
方法,因此通过这样做,可以防止内存缓存的懒惰行为,因为只有当缓存键不可用时,它才会调用该方法。
为了继续这样做,必须存储创建值的实际表达式,因此必须执行以下操作:
Func<MyObject> createValue = () => myService.GetAllAsync();
const string cacheKey = "MyController_MyAction";
return Json(await MemoryCache.GetOrCreateAsync(cacheKey, entry => createValue()));
所以,把它抽象化,这就是你最终可以得到的:
public Task<IActionResult> MyAction()
=> GetCache("MyController_MyAction", () => myService.GetAllAsync());
该方法的实现方式如下:
private async Task<IActionResult> GetCache<T>(string cacheKey, Func<Task<T>> createAction)
{
var result = await MemoryCache.GetOrCreateAsync(cacheKey, entry => createAction());
return Json(result);
}
如果缓存键总是
<ControllerName>_<ActionName>
,您甚至可以再执行一步,并使用
CallerMemberNameAttribute
:
private async Task<IActionResult> GetCache<T>(Func<Task<T>> createAction, [CallerMemberName] string actionName = null)
{
var cacheKey = GetType().Name + "_" + actionName;
var result = await MemoryCache.GetOrCreateAsync(cacheKey, entry => createAction());
return Json(result);
}
所以你可以这样使用它:
public Task<IActionResult> MyAction()
=> GetCache(() => myService.GetAllAsync());