原本關于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)表緩存函數

只要調用了GetList()函數,系統就會將全表記錄(重寫GetExpression()函數的,只加載符合條件的記錄)以IList<T>存儲方式緩存到IIS緩存中,供其他相關函數使用,緩存當天有效,第二天訪問時會自動清空重新加載
一般來說,前端與后端在一個項目時,后端操作緩存會直接影響前端的數據。如果前后端分開,做為兩個項目來開發時,進行增、刪、改操作時就必須調用DelAllCache()函數來清除前后端的緩存,以便兩個站點的緩存能及時同步(目前對于使用IIS緩存跨站點記錄級別緩存同步還沒有一個比較好的處理方法,只能直接清空整表緩存來實現),調用DelAllCache()函數時,會執行CommonBll.RemoveCache(const_CacheKey)函數,該函數會通過一個前端訪問接口,發送經過加密處理后的數據,前端接口接收到請求后再清除對應緩存來實現前后端IIS緩存同步功能。
?
? 3)實體轉換函數

由于SubSonic3.0插件生成的Model附加了很多功能,在對實體進行賦值操作時使用了Linq運算,判斷該字段是否有進行賦值操作,沒有的話在最終生成SQL時,會自動過濾掉該字段。這個功能非常不錯,但是將實體存儲到緩存中或進行Json轉換等操作時,由于這個運算導致程序進入了死循環,無法運行,所以必須將它進行一次轉換,轉化為最常見的普通實體,具體大家可以查看Solution.DataAccess層SubSonic文件夾下ActiveRecord.tt模板生成的類與CreateModel.tt模板生成的類文件比較一下。實體轉換函數就是將這兩種不同的實體進行相互轉換的函數
SubSonic3.0插件ActiveRecord.tt生成的Model
自定義CreateModel.tt模板生成的實體
?
? 4)獲取DataTable與綁定Grid表格

主要是用于通過條件查詢,獲取指定表記錄,然后與后端的FineUI.Grid綁定,具體使用例子會在Web層的相關章節中說明
大家在看源碼時會發現CommonBll.WriteLog("獲取Information表記錄時出現異常", e);這樣的代碼,其實在整個框架中這種代碼大量存在,它會將出現的異常或操作步驟,忠實的記錄指定目錄的文本文件中,方便我們查看分析。特別是項目上線后,在生產環境中我們很多時候是不能直接對生產環境進行測試的,而用戶是做了什么操作才出現這種異常的沒有日志記錄就很難進行排查,所以我們在編寫自定義邏輯層函數時,也隨手將這樣的代碼寫上,以方便我們以后分析問題。
而HttpContext.Current.Session["SpendingTime"] = (swatch.ElapsedMilliseconds / 1000.00).ToString();這種代碼記錄的是執行查詢綁定FineUI.Grid花費的時間,并會在Web層相關列表頁面顯示出來,方便我們了解頁面的執行效率。
模版會生成兩種類型的Grid表格綁定函數,一個是正常的列表綁定,一個是用于多級分類時有層次感顯示的列表綁定。正常列表是直接從數據庫中查詢出來,而有層次感的列表,使用的是內存分頁,而不是整表緩存。它是將按條件查詢出來的記錄緩存到內存中,在點擊翻頁時,是在內存中獲取分頁然后顯示。
有層次感列表例子:
?
5)添加與編輯記錄函數

執行更新操作后,會檢查是否啟用了緩存功能,啟用了由會同步更新緩存記錄。然后執行用戶操作日志記錄功能,將用戶執行了什么操作更新到對應的數據庫中。其他刪除與更新操作都會做同樣的記錄。(有了詳細的操作日志記錄,萬一后端系統管理人員操作出了什么問題,要落實操作責任也就很容易查找出來)
?
6)保存排序與自動排序函數

保存排序函數是將列表中直接填寫的排序直接保存到數據庫中
自動排序函數執行后,會將當前頁面所綁定表格的所有記錄分級別全部從小到大重新進行排序,比如二級分類原排序值為1、2、5、10、11、12,執行后會變成1、2、3、4、5、6。
同時會清除緩存,并且添加用戶操作記錄。
Web層會將這兩個函數進行封裝,處理后無需再編寫代碼,只要添加了對應按鍵就會自支繼承相應功能,減少Web層的重復代碼編寫
?
由于使用了新的工具類庫,模板也做了一些修改,代碼實現就花了好幾天才完成,而直接完成代碼后,文章都不知道怎么寫才合適了,今天完成后反復看了幾遍,都覺得寫得差強人意,呵呵......
除了上面介紹的函數外,還有其他類與模板函數大家自己看吧,有什么問題再發上來大家一起討論
?
4、小結
寫到這里,其實框架的底層結構算是基本完成的,T4模板與SubSonic3.0的結合,產生一個輕量級的開發框架,無論是開發Winform、Web服務還是其他軟件,在這個組合下都可以令我們輕松應對,去除了大量的重復編碼時間,輕輕松松一鍵生成我們需要的大部分代碼。而模板設計合理的話,應用一些新技術或替換某些功能(比如IIS模板換成Redis模板),Web層基本上不用做什么修改就可以直接使用了。對于數據庫添加新表新字段,修改或刪除字段操作,也變得很輕松。由于整個設計不存在硬編碼,就算有些地方要修改,運行一下編譯就能馬上知道需要修改那個位置。
?
? ? 本文轉自 AllEmpty 博客園博客,原文鏈接:http://www.cnblogs.com/EmptyFS/p/3759993.html,如需轉載請自行聯系原作者