Memperluas jawaban @Hrvoje Hudo ...
Kode:
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;
}
Contohnya
Caching item tunggal (ketika setiap item di-cache berdasarkan ID-nya karena caching seluruh katalog untuk jenis item akan terlalu intensif).
Product product = cache.Get("product_{0}", productId, 10, productData.getProductById);
Caching semua hal
IEnumerable<Categories> categories = cache.Get("categories", 20, categoryData.getCategories);
Mengapa TId
Pembantu kedua sangat baik karena sebagian besar kunci data tidak komposit. Metode tambahan dapat ditambahkan jika Anda sering menggunakan kunci komposit. Dengan cara ini Anda menghindari melakukan segala macam penggabungan string atau string. Format untuk mendapatkan kunci untuk meneruskan ke penolong cache. Ini juga membuat melewati metode akses data lebih mudah karena Anda tidak harus memasukkan ID ke dalam metode pembungkus ... semuanya menjadi sangat singkat dan konsisten untuk sebagian besar kasus penggunaan.