Я использовал действия, похожие на пример 1, для асинхронного кэширования результатов JSON для моего .NET Core API.MemoryCache
является экземпляром IMemoryCache
.
Пример 1 (работает должным образом):
[HttpGet]
public async Task<IActionResult> MyAction() =>
Json(await MemoryCache.GetOrCreateAsync(
"MyController_MyAction",
entry => myService.GetAllAsync()
));
Вызовы Json()
и MemoryCache.GetOrCreate()
дублируются во многих моих действиях.В моем реальном приложении есть еще более дублированные детали реализации, такие как установка значения AbsoluteExpirationRelativeToNow
и возвращение 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
в кеше при последующих запросах и каждый раз заново извлекаются данные (что подтверждается инструкциями temp debug TryGetValue()
, а также отслеживание базовых запросов SQL, попадающих в мою базу данных).
Для меня Пример 1 и Пример 2 должны быть идентичны.Однако, возможно, мое понимание async / await и Tasks отсутствует (очень вероятно).
Как я могу абстрагироваться от дублированных деталей реализации (таких как Json()
и MemoryCache.GetOrCreate()
вызовы) от моих действий, пока ещеуспешно обновлять и извлекать из IMemoryCache
в асинхронном режиме?