Daha önce Web Api ile ilgili yazdığımız yazılarda çeşitli konulara değinmiştik ve bunlardan bir tanesi de yazısıydı. Bu yazımızda yine web api için cache'den bahsediyor olacağız anack bu sefer output cache değilde uygumala içerisinde kendimiz manuel olarak memory'e atıp daha sonra kullanmak istediğimiz de alıp modify edebilmemizi sağlayan veya direkt olarak output cache de olduğu gibi alıp client'a dönmemizi sağlayan yapı MemoryCache den bahsediyor olacağız. MemoryCache .Net 4.0 ile birlikte System.Runtime.Caching.dll içerisinde sunulmuş bir yapı olarak karşımıza çıkıyor. Projemize bu dll'i referans olarak eklemek için solution'da bulunan references'a sağ tıklayıp add reference deyip Assemblies => Framework kategorisine tıkalyıp gelen listeden System.Runtime.Caching.dll'ini seçip ekliyoruz.
Referansımızı ekeldikten sonra projemize MemoryCacheManager adında adında bir class ekleyelim. Case şöyle olsun, ProductController.cs adında bir controller ve içerisinde GetAllProducts ve GetProductById adında iki metot tanımlayalım. İlk metotda geriye döndüğümüz product listesini ICache den implement olan MemoryCacheManager class'ını kullanarak MemoryCache'e atalım ve GetProductById metoduna Id parametresi ile request'te bulunulduğunda cache'den okuyup geriye product objesini dönelim.
ICache.cs
public interface ICache
{
bool Contains(string key);//key varmı yokmu diye control ettiğimiz metot
void Add<T>(string key, T source);//cache key'i ile birlikte cache model'i alıp cache'e ekleyen metot
T Get<T>(string key);//key parametresi alarak cache'de ki data yı return eden metot
void Remove(string key);//key parametresine göre mevcut cache'i silen metot
}
MemoryCacheManager.cs
public class MemoryCacheManager : ICache
{
ObjectCache cache;
public MemoryCacheManager()
{
cache = MemoryCache.Default;
}
public void Add<T>(string key, T source)
{
//60 dakika boyunca cache'de tutacak
var policy = new CacheItemPolicy { AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(60) };
cache.Add(key, source, policy);
}
public bool Contains(string key)
{
return cache.Contains(key);
}
public T Get<T>(string key)
{
return (T)cache.Get(key);
}
public void Remove(string key)
{
cache.Remove(key);
}
}
Product.cs
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Category { get; set; }
public decimal Price { get; set; }
}
ProductController.cs
public class ProductController : ApiController
{
[HttpGet]
public Product[] GetAllProducts()
{
Product[] products = new Product[]
{
new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 },
new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M },
new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M }
};
//ürünleri cache'e atıyoruz
var cm = new MemoryCacheManager();
string cacheKey = "products";
if (cm.Contains(cacheKey))//varmı diye kontrol ediyoruz, eğer varsa mevcutu sil yeni listeyi ekle
cm.Remove(cacheKey);
cm.Add(cacheKey, products);
return products;
}
[HttpGet]
public Product GetProductById(int Id)
{
var cm = new MemoryCacheManager();
string cacheKey = "products";
if (cm.Contains(cacheKey))//varmı diye kontrol ediyoruz
return cm.Get<Product[]>(cacheKey).FirstOrDefault(p => p.Id == Id);
return null;
}
}
Projemizi run edip browser aracılığıyla önce GetAllProducts metoduna request'te bulunuyoruz ve product listesini return etmeden önce MemoryCacheManager'ın Add metodunu kullanarak geriye product listesini return etmeden önce listeyi alıp "products" key'i ile cache'e atıyor ve sonrasında return ediyor. Product listesini aldıktan sonra Id=2 olan ürün için GetProductById metoduna request'te bulunuyoruz ve ilk olarak MemoryCacheManager içerisine gidip "products" key'i ile mcache atılmış olan product listesini bulup alıyor ve sonrasında Id=2 olan product'ı bulup geriye döndürüyor.
Manuel olarak MemoryCache entegrasyonu bu şekilde yapabilirsiniz veya ihtiyaca göre farklı kullanımlarda uygulayabilirsiniz. Cache önemlidir arkadaşlar, doğru yerde kullanıldığında çok can kurtarır :)