我已经创建了一个使用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);
}
当然,这里有两个错误:
这显然不是正确的做法,但我认为我会展示我的工作。有人可以指导我朝正确的方向发展吗?
答案 0 :(得分:5)
我最终使用了通用扩展方法:
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 :(得分:1)
怎么样:
public static Cache<T> GetCache<T>(this Cache cache)
{
return new Cache<T>(cache, typeof(T).Name);
}
这当然必须在另一个班级中定义。
答案 2 :(得分:0)
我认为需要更改以下方法:
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;
}
如果项目不在缓存中,则不要将项目放在缓存中供以后使用或以后检索。
谢谢,