c# – 摘要远程调用API中的IMemoryCache
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 摘要远程调用API中的IMemoryCache,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2885字,纯文字阅读大概需要5分钟。
内容图文
我一直在使用类似于示例1的操作来为我的.NET Core API异步缓存json结果. MemoryCache是??IMemoryCache的一个实例.
示例1(按预期工作):
[HttpGet]
public async Task<IActionResult> MyAction() =>
Json(await MemoryCache.GetOrCreateAsync(
"MyController_MyAction",
entry => myService.GetAllAsync()
));
在我的许多操作中,对Json()和MemoryCache.GetOrCreate()的调用都是重复的.在我的真实应用程序中,还有更多重复的实现细节,例如设置AbsoluteExpirationRelativeToNow值并返回null的NotFound().我想将所有这些抽象为一个共享方法,以便每个操作只将其唯一的细节传递给共享方法的调用.
为了做到这一点,我为我的操作中的两个变量中的每一个提取了一个变量.例如.:
示例2(缓存既未更新也未从中检索):
[HttpGet]
public async Task<IActionResult> MyAction()
{
var task = myService.GetAllAsync();
const string cacheKey = "MyController_MyAction";
return Json(await MemoryCache.GetOrCreateAsync(cacheKey, entry => task));
}
下一步是提取共享方法Get(),如:
示例3(不起作用,因为示例2不起作用):
[HttpGet]
public async Task<IActionResult> MyAction()
{
var task = myService.GetAllAsync();
const string cacheKey = "MyController_MyAction";
return await Get(task, cacheKey);
}
protected async Task<IActionResult> Get(Task<T> task, string cacheKey =>
return Json(await MemoryCache.GetOrCreateAsync(cacheKey, entry => task));
示例1成功从缓存中检索后续结果.但是,示例2在后续请求的缓存中找到null并且每次都重新检索数据(由临时调试TryGetValue()语句验证,以及监视命中我的数据库的基础SQL查询).
对我来说,实施例1和实施例2应该是相同的.但是,也许我对async / await和Tasks的理解很缺乏(非常可能).
如何从我的操作中抽象出重复的实现细节(例如Json()和MemoryCache.GetOrCreate()调用),同时仍以异步方式成功更新和从IMemoryCache中检索?
解决方法:
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());
内容总结
以上是互联网集市为您收集整理的c# – 摘要远程调用API中的IMemoryCache全部内容,希望文章能够帮你解决c# – 摘要远程调用API中的IMemoryCache所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。