Estendendo a resposta de @Hrvoje Hudo ...
Código:
using System;
using System.Runtime.Caching;
public class InMemoryCache : ICacheService
{
public TValue Get<TValue>(string cacheKey, int durationInMinutes, Func<TValue> getItemCallback) where TValue : class
{
TValue item = MemoryCache.Default.Get(cacheKey) as TValue;
if (item == null)
{
item = getItemCallback();
MemoryCache.Default.Add(cacheKey, item, DateTime.Now.AddMinutes(durationInMinutes));
}
return item;
}
public TValue Get<TValue, TId>(string cacheKeyFormat, TId id, int durationInMinutes, Func<TId, TValue> getItemCallback) where TValue : class
{
string cacheKey = string.Format(cacheKeyFormat, id);
TValue item = MemoryCache.Default.Get(cacheKey) as TValue;
if (item == null)
{
item = getItemCallback(id);
MemoryCache.Default.Add(cacheKey, item, DateTime.Now.AddMinutes(durationInMinutes));
}
return item;
}
}
interface ICacheService
{
TValue Get<TValue>(string cacheKey, Func<TValue> getItemCallback) where TValue : class;
TValue Get<TValue, TId>(string cacheKeyFormat, TId id, Func<TId, TValue> getItemCallback) where TValue : class;
}
Exemplos
Armazenamento em cache de item único (quando cada item é armazenado em cache com base em seu ID porque o armazenamento em cache de todo o catálogo para o tipo de item seria muito intenso).
Product product = cache.Get("product_{0}", productId, 10, productData.getProductById);
Armazenando em cache tudo
IEnumerable<Categories> categories = cache.Get("categories", 20, categoryData.getCategories);
Por que dizer
O segundo auxiliar é especialmente interessante porque a maioria das chaves de dados não é composta. Métodos adicionais podem ser adicionados se você usar chaves compostas frequentemente. Dessa forma, você evita fazer todos os tipos de concatenação ou sequência de caracteres. Formata para que a chave passe para o auxiliar de cache. Isso também facilita a passagem do método de acesso a dados, porque você não precisa passar o ID para o método wrapper ... tudo se torna muito conciso e consistente para a maioria dos casos de uso.