@Hrvoje Hudson'un cevabı genişletiliyor ...
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;
}
Örnekler
Tek öğe önbellekleme (öğe türü için tüm kataloğun önbelleğe alınması çok yoğun olacağından, her öğe kimliğine göre önbelleğe alındığında).
Product product = cache.Get("product_{0}", productId, 10, productData.getProductById);
Bir şeyi önbelleğe alma
IEnumerable<Categories> categories = cache.Get("categories", 20, categoryData.getCategories);
Neden TId
İkinci yardımcı özellikle güzeldir çünkü çoğu veri anahtarı bileşik değildir. Bileşik anahtarları sık kullanırsanız ek yöntemler eklenebilir. Bu şekilde önbellek yardımcısına geçmek için anahtar almak için her türlü dize birleştirme veya string.Formats yapmaktan kaçının. Ayrıca, veri erişim yöntemini geçirmeyi de kolaylaştırır, çünkü kimliği sarma yöntemine geçirmeniz gerekmez ... her şey kullanım vakalarının çoğu için çok kısa ve tutarlı hale gelir.