Rozszerzając odpowiedź @Hrvoje Hudo ...
Kod:
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;
}
Przykłady
Buforowanie pojedynczego elementu (gdy każdy element jest buforowany na podstawie jego identyfikatora, ponieważ buforowanie całego katalogu dla typu elementu byłoby zbyt intensywne).
Product product = cache.Get("product_{0}", productId, 10, productData.getProductById);
Buforowanie wszystkiego
IEnumerable<Categories> categories = cache.Get("categories", 20, categoryData.getCategories);
Dlaczego TId
Drugi pomocnik jest szczególnie miły, ponieważ większość kluczy danych nie jest złożona. Dodatkowe metody można dodać, jeśli często używasz kluczy kompozytowych. W ten sposób unikasz wykonywania wszelkiego rodzaju konkatenacji łańcuchów lub łańcuchów. Formaty, aby uzyskać klucz do przekazania do pomocnika pamięci podręcznej. Ułatwia także przekazywanie metody dostępu do danych, ponieważ nie trzeba przekazywać identyfikatora do metody otoki ... całość staje się bardzo zwięzła i spójna w większości przypadków użycia.