Last updated on 19 Ekim 2010
Yazdigimiz web uygulamalarinda hepimiz Cache yapisini en az bir kere kullanmisizdir. Cache kolleksiyonuna daha onceden yazdigimiz nesneleri okumak icin kullanilan bir tasarim deseni olan State Bag Access Patterni farkinda olmadan hepimiz kullanmistir.
1: public List List()
2: {
3: List myList;
4: if (Cache["customers"] == null)
5: {
6: myList = DAL.ListCustomers();
7: Cache.Insert("customers", mList, null, DateTime.Now.AddHours(1), TimeSpan.Zero);
8: }
9: return (List)Cache["customers"];
10: }
Fakat bu tasarim deseninde dikkat etmemiz gereken ince bir puf nokta var. Cache kolleksiyonunda tuttugumuz nesneye bir istek geldiginde, onu sadece bir defa okumaliyiz. Aksi takdirde cache kolleksiyonunda bulunan bir nesne yukaridaki kodda da gozuktugu gibi; 4. satirda dolu iken 9. satira gectigi an null hale gelmis olabilir. Buda bizim ?Object reference not set to an instance of an object? hatasi ile karsi karsiya gelmemize sebep olur. Bu durumdan korunmak icin yazmamiz gereken kod ise asagida gosterilmistir.
1: public List List()
2: {
3: string cacheKey = "customers";
4: List myList = Cache[cacheKey] as List;
5: if (myList == null)
6: {
7: myList = DAL.ListCustomers();
8: Cache.Insert(cacheKey, mList, null, SiteConfig.CacheDuration, TimeSpan.Zero);
9: }
10: return myList;
11: }
method:
public T Get<T> (string key, Func<T> ifNullRetrievalMethod)
{
T item = (T) HttpRuntime.Cache.Get(key);
if (item == null)
{
item = ifNullRetrievalMethod();
Insert(key, item);
}
return item;
}
kullanim:
public User GetUserFromId(int userId)
{
return CacheFactory.GetInstance.Get(userId,
() => _dataStore.GetUserFromId(userId));
}