国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

從零開始編寫自己的C#框架(14)——T4模板在邏輯層中的應用(三)

2019-11-17 01:34:08
字體:
來源:轉載
供稿:網友

從零開始編寫自己的C#框架(14)——T4模板在邏輯層中的應用(三)

  原本關于T4模板原想分5個章節詳細解說的,不過因為最近比較忙,也不想將整個系列時間拉得太長,所以就將它們整合在一塊了,可能會有很多細節沒有講到,希望大家自己對著代碼與模板去研究。

  本章代碼量會比較大,基本將Web層要使用到的大部分函數都用模板生成了出來,而模板中的函數,很多也是互相關聯調用的。另外在DotNet.Utilities(公共函數項目)中也添加與修改了一些類和函數。

  需要特別說明的是,在邏輯層添加了July大神編寫的超強上傳類,具體怎么使用功能怎么強大,在后面調用到時會用一個章節詳細說明。呵呵......

  1、先了解解決方案中各個新增文件功能,具體的文件對應說明,請查看《數據字典》中的“目錄與文件說明”

  這個是各個表對應的邏輯層類,里面是Web層常用的各種函數。application文件夾是各種公共邏輯層函數類,Systems文件夾是后端系統管理模塊常用函數類。以后添加新的文件時,可以按功能或業務進行對應分類存放。

  

  LogicBase.cs是邏輯層所有模板生成類的父類,里面有兩個虛函數,用來給模板類調用。在有需要的時候,在自定義類中重寫這兩個函數,就可以給模板中的相應函數自動調用執行。

  DelCache()函數是模板類中進行添加、修改、刪除、更新等對數據庫記錄進行變更時會同步調用到,主要用于擁有自定義緩存的類中,重寫該函數后,進行前面的各項操作時自動執行該函數,以達到同步理清自定義緩存的功能。

  GetExPRession()函數是提供給模板類中的緩存加載函數(GetList())使用的。我們在開發時會創建很多表,有些表全部記錄需要加載到緩存中;有一些表記錄不需要加載到緩存當中(比如日志表);同時也有一些表的記錄會過期,只需要加載指定條件的記錄到緩存使用就可以了,對于后者我們就可以使用GetExpression()函數來進行控制,只要重寫這個函數,系統在運行GetList()函數時就會自動加載我們自定義的條件,從數據庫中篩選出我們想要的記錄到緩存中。

  

  CommonBll.cs是邏輯層的工具類,主要提供給模板生成類調用。具體使用方法請看注釋和相關例子。

  

  2、邏輯層T4模板文件CreateBll.tt(文件在文章后面下載源碼里)

  模板運行后將會生成下圖中的這些函數

  

  其中IIS緩存又包含下圖中這些常用函數

  

  原來是想使用Redis來處理緩存的,后來考慮到對于中小型項目來說,很多都沒有獨立的空間,使用的是虛擬機,用Redis也就不是很合適了,所以換成IIS緩存來處理

  IIS緩存也由之前的表級別緩存修改為記錄級別了,就是說你對某一條記錄進行添加、刪除、修改、更新等操作時,不用清空整個表緩存,直接對緩存中的記錄進行操作,不過這個功能剛剛改為記錄級別,得Web層代碼開始寫后才能測試看看效果怎么樣

  3、主要模板函數功能說明

  1)模板函數調用使用單例模式

  對于中小型項目來說,訪問量并發量并不是很大,單例模式已經夠用了,如果對某一個表并發量過大時,怕出現問題,也可以直接new出這個類,不使用單例調用就可以了

  比如:

  單例模式調用

    InformationBll.GetInstence().GetList();

  非單例模式調用

    var information = new InformationBll();    information.GetList();

  

  2)表緩存函數

 1 private const string const_CacheKey = "Cache_Information"; 2         private const string const_CacheKey_Date = "Cache_Information_Date"; 3  4         #region 清空緩存 5         /// <summary>清空緩存</summary> 6         private void DelAllCache() 7         { 8             //清除模板緩存 9             CacheHelper.RemoveOneCache(const_CacheKey);10             CacheHelper.RemoveOneCache(const_CacheKey_Date);11 12             //清除前臺緩存13             CommonBll.RemoveCache(const_CacheKey);14             //運行自定義緩存清理程序15             DelCache();16         }17         #endregion18 19         #region IIS緩存函數20         21         #region 從IIS緩存中獲取Information表記錄22         /// <summary>23         /// 從IIS緩存中獲取Information表記錄24         /// </summary>25         /// <param name="isCache">是否從緩存中讀取</param>26         public IList<Dataaccess.Model.Information> GetList(bool isCache = true)27         {28             try29             {30                 //判斷是否使用緩存31                 if (CommonBll.IsUseCache() && isCache){32                     //檢查指定緩存是否過期——緩存當天有效,第二天自動清空33                     if (CommonBll.CheckCacheIsExpired(const_CacheKey_Date)){                34                         //刪除緩存35                         DelAllCache();36                     }37 38                     //從緩存中獲取DataTable39                     var obj = CacheHelper.GetCache(const_CacheKey);40                     //如果緩存為null,則查詢數據庫41                     if (obj == null)42                     {43                         var list = GetList(false);44 45                         //將查詢出來的數據存儲到緩存中46                         CacheHelper.SetCache(const_CacheKey, list);47                         //存儲當前時間48                         CacheHelper.SetCache(const_CacheKey_Date, DateTime.Now);49 50                         return list;51                     }52                     //緩存中存在數據,則直接返回53                     else54                     {55                         return (IList<DataAccess.Model.Information>)obj;56                     }57                 }58                 else59                 {60                     //定義臨時實體集61                     IList<DataAccess.Model.Information> list = null;62 63                     //獲取全表緩存加載條件表達式64                     var exp = GetExpression<Information>();65                     //如果條件為空,則查詢全表所有記錄66                     if (exp == null)67                     {68                         //從數據庫中獲取所有記錄69                         var all = Information.All();70                         list = all == null ? null : Transform(all.ToList());71                     }72                     else73                     {74                         //從數據庫中查詢出指定條件的記錄,并轉換為指定實體集75                         var all = Information.Find(exp);76                         list = all == null ? null : Transform(all);77                     }78 79                     return list;80                 }                81             }82             catch (Exception e)83             {84                 //記錄日志85                 CommonBll.WriteLog("從IIS緩存中獲取Information表記錄時出現異常", e);86             }87             88             return null;89         }90         #endregion
View Code

  只要調用了GetList()函數,系統就會將全表記錄(重寫GetExpression()函數的,只加載符合條件的記錄)以IList<T>存儲方式緩存到IIS緩存中,供其他相關函數使用,緩存當天有效,第二天訪問時會自動清空重新加載

  一般來說,前端與后端在一個項目時,后端操作緩存會直接影響前端的數據。如果前后端分開,做為兩個項目來開發時,進行增、刪、改操作時就必須調用DelAllCache()函數來清除前后端的緩存,以便兩個站點的緩存能及時同步(目前對于使用IIS緩存跨站點記錄級別緩存同步還沒有一個比較好的處理方法,只能直接清空整表緩存來實現),調用DelAllCache()函數時,會執行CommonBll.RemoveCache(const_CacheKey)函數,該函數會通過一個前端訪問接口,發送經過加密處理后的數據,前端接口接收到請求后再清除對應緩存來實現前后端IIS緩存同步功能。

  3)實體轉換函數

  1 #region 實體轉換  2         /// <summary>  3         /// 將Information記錄實體(SubSonic實體)轉換為普通的實體(DataAccess.Model.Information)  4         /// </summary>  5         /// <param name="model">SubSonic插件生成的實體</param>  6         /// <returns>DataAccess.Model.Information</returns>  7         public DataAccess.Model.Information Transform(Information model)  8         {              9             if (model == null)  10                 return null; 11  12             return new DataAccess.Model.Information 13             { 14                 Id = model.Id, 15                 InformationClass_Root_Id = model.InformationClass_Root_Id, 16                 InformationClass_Root_Name = model.InformationClass_Root_Name, 17                 InformationClass_Id = model.InformationClass_Id, 18                 InformationClass_Name = model.InformationClass_Name, 19                 Title = model.Title, 20                 RedirectUrl = model.RedirectUrl, 21                 Content = model.Content, 22                 Upload = model.Upload, 23                 FrontCoverImg = model.FrontCoverImg, 24                 Note = model.Note, 25                 NewsTime = model.NewsTime, 26                 KeyWords = model.Keywords, 27                 SEOTitle = model.SeoTitle, 28                 SeoKey = model.SeoKey, 29                 SeoDesc = model.SeoDesc, 30                 Author = model.Author, 31
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 西畴县| 娄底市| 临沧市| 宁城县| 米易县| 西乡县| 崇文区| 子洲县| 方山县| 江门市| 察雅县| 尚义县| 佳木斯市| 吉隆县| 株洲市| 甘孜县| 天津市| 南京市| 依安县| 泰州市| 南皮县| 黄浦区| 英超| 丰台区| 林芝县| 云梦县| 邵武市| 讷河市| 丹寨县| 荆州市| 怀化市| 崇礼县| 揭西县| 集贤县| 永年县| 鹤峰县| 长顺县| 雷山县| 凤冈县| 甘谷县| 邵阳县|