C# 靜態(tài)泛型緩存

從趙劼 的博客中看的的方法灾梦,通過泛型建立一個泛型數(shù)據(jù)緩存,略加改進妓笙。
閑話少說若河,上代碼

最原始的樣子

static class DataCache<TModel>{
    public IEnumerable<TModel> Cache{get;set;}
}

哈哈,就這么簡單寞宫,需要自己設(shè)置緩存數(shù)據(jù)并獲取萧福,沒有任何的應(yīng)用邏輯
非常方便的說。
.Net 運行時會安排緩存數(shù)據(jù)的存放辈赋,保證不同類型的數(shù)據(jù)不會搞混鲫忍。

不過這樣太簡單了膏燕,增加一點功能,從 DataContext 中直接加載緩存數(shù)據(jù)悟民。

static class DataCache<TModel>{
    private IEnumerable<TModel> Cache{get;set;}

    public static IEnumerable<TModel> GetCacheData<TDataContext>(TDataContext dataContext)
            where TDataContext : DataContext{
            if (dataContext == null){
                throw new ArgumentNullException("dataContext");
            }
            if (CacheData == null){
                CacheData = dataContext.GetTable<TModel>().ToList();
            }
            return CacheData;
        }
}

不同的 DataContext 子類加載的數(shù)據(jù)都會放在一起坝辫,但是通常 不同的 DataContext 命名空間不會一樣,也不會有相同的表射亏,所以盡可以放心使用近忙。

最后一個問題,如何清理緩存智润,當數(shù)據(jù)變化時银锻,需要重新加載緩存,沒什么好辦法做鹰,把緩存清理之后,再次訪問的時候就會重新加載數(shù)據(jù)鼎姐。
通常有兩種情況钾麸,本程序數(shù)據(jù)修改和其他客戶端進行的數(shù)據(jù)修改。
沒有數(shù)據(jù)修改的通知炕桨,只好自己清理緩存了饭尝。

基類 IGenericsCache 建立了一個清理緩存方法的列表,每次加載數(shù)據(jù)就會增加一個方法献宫,需要全部清理的時候執(zhí)行一下就可以了钥平。

    /// <summary>
    /// 泛型數(shù)據(jù)緩存基類 定義 清除全部緩存功能
    /// 在繼承類中,實現(xiàn)獲取緩存的方法中 必須增加一個清理緩存的 活動
    /// </summary>
    public class IGenericsCache{
        /// <summary>
        /// 保存 清理緩存的 <see cref="Action"/>
        /// </summary>
        protected static readonly List<Action> ClearCacheActions = new List<Action>();

        /// <summary>
        /// 清理全部緩存
        /// </summary>
        public static void ClearAllCache(){
            foreach (Action action in ClearCacheActions){
                Console.WriteLine(action);
                action.Invoke();
            }
            ClearCacheActions.Clear();
        }
    }


    /// <summary>
    ///     Linq 數(shù)據(jù)源 靜態(tài)泛型緩存
    /// </summary>
    /// <typeparam name="TModel"></typeparam>
    public class GenericsCache<TModel> : IGenericsCache where TModel : class{
        private static IEnumerable<TModel> CacheData { get; set; }

        /// <summary>
        ///     獲取緩存
        /// </summary>
        /// <param name="dataContext"></param>
        /// <returns></returns>
        public static IEnumerable<TModel> GetCacheData<TDataContext>(TDataContext dataContext)
            where TDataContext : DataContext{
            if (dataContext == null){
                throw new ArgumentNullException("dataContext");
            }
            if (CacheData == null){
                CacheData = dataContext.GetTable<TModel>().ToList();
                ClearCacheActions.Add(() => CacheData = null);
            }
            return CacheData;
        }

        public static IEnumerable<TModel> GetCacheData<TDataContext>(TDataContext dataContext,
                                                                     Func<TDataContext, IEnumerable<TModel>>
                                                                         dataAccesser) where TDataContext : DataContext{
            if (dataContext == null){
                throw new ArgumentNullException("dataContext");
            }
            if (CacheData == null){
                CacheData = dataAccesser.Invoke(dataContext).ToList();
                ClearCacheActions.Add(() => CacheData = null);
            }
            return CacheData;
        }


        /// <summary>
        ///     清理 <see cref="TModel">當前類型</see>的緩沖緩存
        /// </summary>
        public static void ClearCache(){
            CacheData = null;
        }
    }

以前總是想著 利用一個字典什么的姊途,可以了解哪些數(shù)據(jù)被緩存了涉瘾,后來發(fā)現(xiàn)這樣一來,泛型緩存就沒有意義了捷兰,只是形式上的泛型方法而已立叛,內(nèi)部實現(xiàn)還是需要獲取類型,那還泛型干什么贡茅。

限制秘蛇,程序中不保證 TModel 一定屬于 TDataContext ,如果不屬于顶考,請使用第二個方法

Func<TDataContext, IEnumerable<TModel>> dataAccesser

通過一個類型轉(zhuǎn)換赁还,可以緩存任意類型的數(shù)據(jù),可以完全和 TDataContext 無關(guān)驹沿。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末艘策,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子甚负,更是在濱河造成了極大的恐慌柬焕,老刑警劉巖审残,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異斑举,居然都是意外死亡搅轿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門富玷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來璧坟,“玉大人,你說我怎么就攤上這事赎懦∪妇椋” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵励两,是天一觀的道長黎茎。 經(jīng)常有香客問我,道長当悔,這世上最難降的妖魔是什么傅瞻? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮盲憎,結(jié)果婚禮上嗅骄,老公的妹妹穿的比我還像新娘。我一直安慰自己饼疙,他們只是感情好溺森,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著窑眯,像睡著了一般屏积。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上磅甩,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天肾请,我揣著相機與錄音,去河邊找鬼更胖。 笑死铛铁,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的却妨。 我是一名探鬼主播饵逐,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼彪标!你這毒婦竟也來了倍权?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎薄声,沒想到半個月后当船,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡默辨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年德频,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缩幸。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡壹置,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出表谊,到底是詐尸還是另有隱情钞护,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布爆办,位于F島的核電站难咕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏距辆。R本人自食惡果不足惜步藕,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挑格。 院中可真熱鬧,春花似錦沾歪、人聲如沸漂彤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挫望。三九已至,卻和暖如春狂窑,著一層夾襖步出監(jiān)牢的瞬間媳板,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工泉哈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蛉幸,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓丛晦,卻偏偏與公主長得像奕纫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子烫沙,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容