Her ne kadar seçmiş olduğum başlık ASP.NET içersede bu yapıyı WPF, WinForms, WindowsServices, ASP.NET MVC gibi .NET ‘in hakim olduğu heryerde kullanabileceğinizi öncelikle belirtmek isterim. İnternet sitelerimizi OutputCache ile önbelleğe aldık ancak sık sık veritabanından aynı veriyi çekmek veya IO işlemleri gerçekleştirmek ciddi performans problemlerine sebep oluyor. Bunu aşmak için verileri önbelleğe almak oldukça geçerli bir çözümdür. .NET kütüphanesindeki ObjectCache sınıfı bu işin biçilmiş kaftandır. Bu yazımda sizlere ObjectCache sınıfını kullanarak veriönbellekme işlemi gerçekleştirmek için kullanışlı bir yol sunmak istiyorum.

public interface ICacheProvider
{
    object Get(string key);
    void Set(string key, object data, int cacheTime);
    bool IsSet(string key);
    void Invalidate(string key);
}

Önbelleğe yazma, okuma, kontrol etme ve silme için metotları tanımlayan bir arayüz oluşturduk. Geriye bu metotları miras alan bir DataCacheProvider sınıfı yazmak kaldı.

public class DataCacheProvider : ICacheProvider
{
    private ObjectCache Cache { get { return MemoryCache.Default; } }
    ///
    /// Önbelleğe aldığımız veri okumak için gereken metod.
    ///
    ///Veri çekmek için kullanacağımız anahtar
    /// Önbelleğe alınmış veri

    public object Get(string key)
    {
        return Cache[key];
    }

    ///
    /// Önbelleğe veri yazmak için kullanacağımız metod
    ///
    ///Daha sonra önbellekten veriyi okumak kullanılacak anahtar.

    ///Önbelleğe yazılacak veri
    ///Dakika cinsinden bellekte veriyi ne kadar tutuyoruz

    public void Set(string key, object data, int cacheTime)
    {
        CacheItemPolicy policy = new CacheItemPolicy();
        policy.AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(cacheTime);
        Cache.Add(new CacheItem(key, data), policy);
    }

    ///
    /// Belirtilen anahtarda önbelleğe alınmış veri var mı?
    ///
    ///Anahtar değerimiz
    ///

    public bool IsSet(string key)
    {
        return (Cache[key] != null);
    }

    ///
    /// Önbelleğe alınmış veriyi silmek için kullanılan metod.
    ///
    ///Anahtar değerimiz
    public void Invalidate(string key)
    {
        Cache.Remove(key);
    }
}

Elimizde istediğimiz veriyi okuyup yazabileceğimiz bir önbellek sağlayımız olduğuna göre LinqToSql ile kullanabileceğimiz bir Repository olsa fena olmazdı.

public class CachedModelsRepository
{
       protected Entities DataContext { get; private set; }
       public ICacheProvider Cache { get; set; }
       public CachedModelsRepository()
            :this(new DataCacheProvider())
        {

        }

        public CachedModelsRepository(ICacheProvider cacheProvider)
        {
            this.DataContext = new Entities(); //EntityFramework
            this.Cache = cacheProvider;
        }
        public List Currencies()
        {
            List currencyData = Cache.Get("Currencies") as List;
            if(currencyData == null)
            {
                currencyData = DataContext.Currencies.OrderBy(c=>c.CurrencyCode).ToList();
                if(currencyData.Any())
                {
                    Cache.Set("Currencies", currencyData, 30);
                }
            }
            return currencyData;
        }
}

Veritabanımızda Currency denen tabloyu önbelleğe aldık. Currency() metodu List tipinde bir sonuç döndürüyor. İlk defa sorgu yaptığınızda 30 dakikalığına önbelleğe alıyor. Sonraki 30 dakika boyunca veritabanına sorgu yapmadan doğrudan önbellekten okuyoruz. Bu da bize müthiş bir performans avantajı veriyor.

ICachedModelRepository Repository = new CachedModelsRepository();
Repository.Currencies().Where(x => x.CurrencyCode==_inputCurrencyCode).Select(x => x.CurrencyName).First();

Şeklinde bir kodlamayla önbelleğe alınmış veriler arasında sorgulama yapabilirsiniz.