Interfejs i klasa Cache
Jak się pewnie domyślacie klasa cache bedzie implementowała interfejs ICache. Najpierw przedstawie jak ona wygląda poźniej krótki opis.
public interface ICache { void Set<T>(string key, object value, DateTime absoluteExpiration, TimeSpan slidingExpiration); void Set<T>(string key, object value, DateTime absoluteExpiration); void Set<T>(string key, object value, TimeSpan slidingExpiration); T Remove<T>(string key); void Clear(); T Get<T>(string key); }Interfejs posiada kilka metod które ustawiają wartość w cache. Różnią się one zmiennymi dotyczącymi wygasania danej wartości z cache. Zmienna AbsoluteExpiration określa bezwzględna datę wygaśnięcia danego obiektu czyli natomiast SlidingExpiration nie określa daty wygaśnięcia a jakiś odcinek czasu po którym ma wygasnąć dany wartość. Reszta nie powinna budzić wątpliwości. Sama implementacja wygląda tak:
public class Cache : ICache { //pomijam deklaracje zmiennych i funkcje set ... public T Remove<T>(string key) { return (T) _cache.Remove(key); } public void Clear() { IDictionaryEnumerator cacheEnumerator = _cache.GetEnumerator(); while (cacheEnumerator.MoveNext()) { _cache.Remove(cacheEnumerator.Key.ToString()); } } public T Get<T>(string key) { Check.Argument.IsNotEmpty(key, "key"); lock (_syncObject) { T cacheItem = (T)_cache.Get(key); if (cacheItem == null) return default(T); else return cacheItem; } } private void DoSet<T>(string key, object value, DateTime absoluteExpiration, TimeSpan slidingExpiration) { Check.Argument.IsNotEmpty(key, "key"); Check.Argument.IsNotNull(value, "value"); if (_cache[key] == null) _cache.Add(key, value, null, absoluteExpiration, slidingExpiration,CacheItemPriority.Normal, null); else _cache.Insert(key, value, null, absoluteExpiration, slidingExpiration); } }Wstawiłem tylko najważniejsze części kodu, pominąłem wszystkie wersje fukcji set ponieważ odwołują się one do prywatnej funkcji DoSet z różnymi parametrami. Jak widać metody tutaj operują na cache z HttpRuntime.Cache. Funkcja Clear pobiera enumerator z kolekcji i usuwa wszystkie obiekty z cache. Funkcja Get pobiera wartość z cache, jeżeli nie istnieje to zwraca wartość domyślną dla danego obiektu. Jest ona thread-safe(bezpieczna wielowątkowo). Natomiast metoda DoSet wstawia obiekt do cache. Sprawdza ona czy już istnieje obiekt o danym kluczu. Jeżeli tak to zamiast dodawać tylko wstawia nową wartość do niego.
W następnym poście powinienem już pokazać mechanizm związany z cachowaniem plików CSS i JS. Oczywiście dodałem testy związane z cachowaniem. Oprócz tego powoli wrzuciłem interfejs graficzny jaki będzie obowiązywał na forum.