Есть ли более эффективный способ проверки того, выходит ли кешированные данные, если он его получает, и если он не делает вызов в api/database, а затем кеширует его? Мне кажется очень неэффективным, чтобы я делал такой код снова и снова.Общее кэширование в C#
List<Map> maps = new List<Map>();
List<Playlist> playlists = new List<Playlist>();
if (SingletonCacheManager.Instance.Get<List<Map>>("Maps") != null)
{
maps = SingletonCacheManager.Instance.Get<ListMap>>("Maps");
}
else
{
maps = _mapRepository.FindBy(x => x.Active).ToList();
SingletonCacheManager.Instance.Add<List<Map>>(maps, "Maps", 20);
}
if (SingletonCacheManager.Instance.Get<List<Playlist>>("Playlists") != null)
{
playlists = SingletonCacheManager.Instance.Get<List<Playlist>>("Playlists");
}
else
{
var p = await _apiService.GetPlaylists();
playlists = p.ToList();
SingletonCacheManager.Instance.Add<List<Playlist>>(playlists, "Playlists", 20);
}
Это что-то вроде этого можно:
List<Map> maps = this.CacheHelper.GetCachedItems<Map>(key, lengthoftime);
, а затем GetCachedItems будет делать проверку кэшированных элементов и получить соответственно. Это похоже на способ, но его, когда кэшированные элементы не существуют, и я должен получить элементы из api/database, которые я не знаю, возможно ли сделать их общий.
Единственное решение - это оператор switch на тип переданного?
switch(<T>type)
{
case<Map>:
return _mapRepository.FindBy(x => x.Active);
case<Playlist>:
return await _apiService.GetPlaylists();
}
Спасибо за любую помощь.
Я делаю что-то вроде этого: https://github.com/WiredUK/Wired.Caching/blob/master/Wired.Caching/InMemoryCache.cs#L52. Поэтому по существу я передаю функцию, чтобы получить данные (из базы данных, API или что-то еще) в функцию кеша и, если требуется, будет вызван только вызов. – DavidG