Универсальная оболочка для функций System.Web.Caching.Cache - PullRequest
3 голосов
/ 17 июня 2010

Я создал универсальную оболочку для использования объекта Cache:

public class Cache<T> where T : class
{
    public Cache Cache {get;set;}
    public CachedKeys Key {get;set;}

    public Cache(Cache cache, CachedKeys key){
        Cache = cache;
        Key = key;
    }

    public void AddToCache(T obj){
        Cache.Add(Key.ToString(),
            obj,
            null,
            DateTime.Now.AddMinutes(5),
            System.Web.Caching.Cache.NoSlidingExpiration,
            System.Web.Caching.CacheItemPriority.Normal,
            null);                   
    }

    public bool TryGetFromCache(out T cachedData) {
        cachedData = Cache[Key.ToString()] as T;
        return cachedData != null;
    }

    public void RemoveFromCache() {
        Cache.Remove(Key.ToString()); }
}

Перечисление CachedKeys - это просто список ключей, которые можно использовать для кэширования данных.

Проблемаэто, чтобы вызвать это вполне конвульсивно:

var cache = new Cache<MyObject>(Page.Cache, CachedKeys.MyKey);
MyObject myObject = null;

if(!cache.TryGetFromCache(out myObject)){
    //get data...
    cache.AddToCache(data); //add to cache
    return data;
}

return myObject;

Я храню только один экземпляр каждого из моих объектов в кэше.

Следовательно, есть ли способчто я могу создать метод расширения, который принимает тип объекта для Cache и использует (через Reflection) его Name в качестве ключа кэша?

public static Cache<T> GetCache(this Cache cache, Type cacheType){
        Cache<cacheType> Cache = new Cache<cacheType>(cache, cacheType.Name);
    }

Конечно, здесь есть две ошибки:

  • Методы расширения должны быть определены в неуниверсальном статическом классе
  • Не удалось найти имя типа или пространства имен 'cacheType'

Это явно неправильный подход, но я думал, что покажу свою работу.Может ли кто-нибудь направить меня в правильном направлении?

Ответы [ 3 ]

5 голосов
/ 17 июня 2010

В итоге я использовал общие методы расширения:

public static class CacheExtensions
{
    public static void Remove<T>(this Cache cache) where T : class
    {
        cache.Remove(typeof(T).Name);
    }

    public static void AddToCache<T>(this Cache cache, object item) where T : class
    {
        T outItem = null;
        if (cache.TryGetItemFromCache<T>(out outItem))
            throw new ArgumentException("This item is already in the cache");

        cache.Insert(typeof(T).Name,
                item,
                null,
                DateTime.Now.AddMinutes(5),
                System.Web.Caching.Cache.NoSlidingExpiration,
                System.Web.Caching.CacheItemPriority.Normal,
                null);
    }

    public static bool TryGetItemFromCache<T>(this Cache cache, out T item) where T : class
    {
         item = cache.Get(typeof(T).Name) as T;
         return item != null;
    }
}

Называется как:

MyObject myObject = null;
if(!Cache.TryGetItemFromCache(out myObject)){
     //get data
     Cache.AddToCache<MyObject>(data);
}

and..

Cache.Remove<MyObject>();
1 голос
/ 17 июня 2010

Как насчет:

public static Cache<T> GetCache<T>(this Cache cache)
{
    return new Cache<T>(cache, typeof(T).Name);
}

Это, конечно, нужно определить в другом классе.

0 голосов
/ 17 июня 2010

Я думаю, что нужно изменить следующий метод:

 public static bool TryGetItemFromCache<T>(this Cache cache, out T item) where T : class
    {
         item = cache.Get(typeof(T).Name) as T;
         return item != null;
    }

Если элемент не находится в кеше, вы не хотите помещать его в кэш для последующего использования или последующего извлечения.

Спасибо

...