我創建了一個通用的包裝使用Cache對象:爲通用的System.Web.Caching.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枚舉只是一個鍵的列表,可用於高速緩存數據。
麻煩的是,把它稱爲是相當convuluted:
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;
我只保存我的每個高速緩存中的對象的一個實例。
因此,有沒有什麼辦法可以創建一個擴展方法來接受要緩存的對象類型並使用(通過Reflection)其Name
作爲緩存鍵?
public static Cache<T> GetCache(this Cache cache, Type cacheType){
Cache<cacheType> Cache = new Cache<cacheType>(cache, cacheType.Name);
}
當然,有兩個錯誤的位置:
- 擴展方法必須在非泛型靜態類
- 類型或命名空間名稱「cacheType」被定義找不到
這顯然不是正確的方法,但我想我會展示我的工作。有人能指引我朝着正確的方向嗎?
此方法線程安全嗎? – 2013-04-25 13:46:57
不 - 你可以引入雙重檢查鎖定(即使不能保證)但懶惰填充緩存我建議任何鎖定會引入不必要的延遲。你可以在運行定時器的後臺線程上填充緩存(如果你對一個正在從線程池中取出的線程執行此操作感到滿意)。我傾向於不擔心 - 我不認爲緩存填充緩存需要線程安全。 – 2013-04-25 14:09:10