原本關于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 #endregionView 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
新聞熱點
疑難解答