從零開始編寫自己的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)表緩存函數

?View Code

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

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

?

?  3)實體轉換函數

?View Code

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

  SubSonic3.0插件ActiveRecord.tt生成的Model

  

  自定義CreateModel.tt模板生成的實體

  

?

?  4)獲取DataTable與綁定Grid表格

?View Code

  主要是用于通過條件查詢,獲取指定表記錄,然后與后端的FineUI.Grid綁定,具體使用例子會在Web層的相關章節中說明

  大家在看源碼時會發現CommonBll.WriteLog("獲取Information表記錄時出現異常", e);這樣的代碼,其實在整個框架中這種代碼大量存在,它會將出現的異常或操作步驟,忠實的記錄指定目錄的文本文件中,方便我們查看分析。特別是項目上線后,在生產環境中我們很多時候是不能直接對生產環境進行測試的,而用戶是做了什么操作才出現這種異常的沒有日志記錄就很難進行排查,所以我們在編寫自定義邏輯層函數時,也隨手將這樣的代碼寫上,以方便我們以后分析問題。

  而HttpContext.Current.Session["SpendingTime"] = (swatch.ElapsedMilliseconds / 1000.00).ToString();這種代碼記錄的是執行查詢綁定FineUI.Grid花費的時間,并會在Web層相關列表頁面顯示出來,方便我們了解頁面的執行效率。

  模版會生成兩種類型的Grid表格綁定函數,一個是正常的列表綁定,一個是用于多級分類時有層次感顯示的列表綁定。正常列表是直接從數據庫中查詢出來,而有層次感的列表,使用的是內存分頁,而不是整表緩存。它是將按條件查詢出來的記錄緩存到內存中,在點擊翻頁時,是在內存中獲取分頁然后顯示。
  有層次感列表例子:

  

?

  5)添加與編輯記錄函數

?View Code

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

?

  6)保存排序與自動排序函數

?View Code


  保存排序函數是將列表中直接填寫的排序直接保存到數據庫中

  自動排序函數執行后,會將當前頁面所綁定表格的所有記錄分級別全部從小到大重新進行排序,比如二級分類原排序值為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,如需轉載請自行聯系原作者




本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286840.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286840.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286840.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

趕緊3分鐘學完15分鐘的內容我要出去玩(8)

作者簡介 作者名&#xff1a;1_bit 簡介&#xff1a;CSDN博客專家&#xff0c;2020年博客之星TOP5&#xff0c;藍橋簽約作者。15-16年曾在網上直播&#xff0c;帶領一批程序小白走上程序員之路。歡迎各位小白加我咨詢我相關信息&#xff0c;迷茫的你會找到答案。 目錄 HTML基…

Android之獲取到音視頻的時長后按格式(00:00或者00:00:00)顯示

1 需求 我們獲取到了本地視頻時長(秒為單位),然后需要按照如下格式顯示 沒有到小時的時長如下格式 00:00 有到小時的時長如下格式 00:00:00 2 代碼實現 /*** 可以顯示小時*/fun getDateStr(ms: Long): String? {val ss = 1val mi = ss * 60val hh = mi * 60val dd = …

Hello Playwright:(5)查找元素

操作瀏覽器歸根到底就是和頁面進行交互&#xff0c;那么必不可少的操作就是查找頁面上的元素。因此我們需要熟練掌握Locator 定位器。在上一節我們講過&#xff0c;可以使用Page.Locator(selector, options)方法創建定位器&#xff0c;而如何定位到元素則取決于selector 選擇器…

RxSwift 之官方文檔

RxSwift 官方文檔結構 Introduction:SubjectsTransforming ObservablesFiltering ObservablesCombining ObservablesError Handing OperatorsObservable Utility OperatorsConditional and Boolean OperatorsMathematical and Aggregate OperatorsConnectable Observable Opera…

SQL一鍵備份用戶數據庫

大家都知道&#xff0c;Ms Sql 有自動備份的功能&#xff0c;但如果由于某種原因不能自動備份&#xff0c;或者我們想手動備份的話&#xff0c;就可以用下邊的sql語句來執行備份。 --------------------代碼開始------------- USE [master]------刪除舊數據-------------------…

2019年甘肅省普通高等學校高職(專科)升本科考試招生工作實施辦法

2019年甘肅省普通高等學校高職&#xff08;專科&#xff09;升本科考試招生工作實施辦法 2019年甘肅省普通高等學校高職&#xff08;專科&#xff09;升本科考試招生工作實施辦法 根據教育部有關規定及要求&#xff0c;結合我省實際&#xff0c;為確保普通高等學校高職&#x…

HTML基礎之bit哥的反客為主之道(9)

作者簡介 作者名&#xff1a;1_bit 簡介&#xff1a;CSDN博客專家&#xff0c;2020年博客之星TOP5&#xff0c;藍橋簽約作者。15-16年曾在網上直播&#xff0c;帶領一批程序小白走上程序員之路。歡迎各位小白加我咨詢我相關信息&#xff0c;迷茫的你會找到答案。 目錄 HTML基…

Atom編輯Markdown文件保存后行尾的空格自動消失的問題解決

Markdown文件的行尾增加兩個空格表示一行結束需要換行。 但保存文件后&#xff0c;行尾的空格自動消失&#xff0c;導致不換行。 解決方法&#xff1a; 1、【Edit】->【Preferences】->【Packages】->【whitespace】->【Settings】->【Keep Markdown Line Brea…

將Abp移植進.NET MAUI項目

前言寫在.NET MAUI官宣正式發布之際&#xff0c;熱烈慶祝MAUI正式發布&#xff01;去年12月份做了MAUI混合開發框架的調研&#xff0c;想起來文章里給自己挖了個坑&#xff0c;要教大家如何把Abp移植進Maui項目。熟悉Abp的同學都知道&#xff0c;Abp 是一套強大的應用程序設計時…

Sql數據庫批量清理日志

說明&#xff1a;SQL數據庫日志經常過大&#xff0c;引起很多問題&#xff0c;網上很多清理日志的方法&#xff0c;但都比較麻煩&#xff0c;并且不能一次性清理所有數據庫。如果有幾十個數據庫要清理&#xff0c;一個個手工來&#xff0c;想必非常麻煩。 以下代碼清除 除了指定…

【BZOJ-2299】向量 裴蜀定理 + 最大公約數

2299: [HAOI2011]向量 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1118 Solved: 488[Submit][Status][Discuss]Description 給你一對數a,b&#xff0c;你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b,-a)這些向量&#xff0c;問你能不能拼…

采用ArcGIS 10.6制作漂亮的點陣世界地圖,完美!!!

如下圖所示,怎樣制作完美漂亮的點陣世界地圖呢?今天我就教大家吧! 其實,制作過程相當簡單,主要的思路是通過世界地圖范圍去創建漁網(標注點),再選擇范圍內的標注點,符號化即可,怎么樣,很簡單吧,下面我們一步一步來實現吧。 1. 加載世界地圖 打開ArcGIS軟件,加載軟…

Android ping命令 -- Runtime

代碼&#xff1a; 1 public String Run(String _strsIp) throws Exception2 {3 String strRst "";4 try5 {6 String str "ping -c 1 "_strsIp;7 Runtime runtime Runtime.getRuntime();8 …

懶辦法1篇文10分鐘快速入門MySQL增刪查改

作者簡介 作者名&#xff1a;1_bit 簡介&#xff1a;CSDN博客專家&#xff0c;2020年博客之星TOP5&#xff0c;InfoQ簽約作者&#xff0c;藍橋簽約作者。15-16年曾在網上直播&#xff0c;帶領一批程序小白走上程序員之路。歡迎各位小白加我咨詢我相關信息&#xff0c;迷茫的你…

Android(kotlin)之對一組圖片數據更新最后的修改時間進行分類顯示

1 需求 我們需要實現攜帶時間頭的一系列照片如下顯示,現在我們拿到了圖片集合,肯定需要對圖片根據實現進行分組顯示 date picture picture picture picture picture picture picture picture picturedate picture picture picture picture picture 2 代碼實現 fun getImag…

SqlServer 數據庫 分離復制備份然后附加回數據庫 sql代碼

工作中&#xff0c;我們經常需要把數據庫進行分離&#xff0c;復制數據庫到另一個地方&#xff0c;再將原數據庫文件附加回數據庫 。 當然通過鼠標操作的步驟比較麻煩&#xff1a; 1、 右鍵數據庫 --------任務------分離 2、打開數據庫文件所在目錄&#xff0c;復制數據庫 …

01:操作系統(centos,redhat):性能監控和網絡命令

性能監控和優化命令 top命令功能&#xff1a;顯示當前系統正在執行的進程的相關信息&#xff0c;包括進程ID、內存占用率、CPU占用率等常用參數&#xff1a;-d 屏幕刷新間隔時間屏幕信息解釋字段說明&#xff1a;第一行&#xff1a;top 當前系統時間up 系統運行時間…

大話領域驅動設計——領域層

概述在DDD中&#xff0c;業務邏輯主要分布在領域層和應用層兩層&#xff0c;他們包含不同的業務邏輯。這一篇&#xff0c;我們先對領域層做詳細的講解分析。領域層實現了領域或系統的&#xff0c;與用戶界面上的用戶交互&#xff08;用例&#xff09;無關的核心業務邏輯。總覽領…

【北斗】北斗衛星導航系統(BDS)介紹

一、概述 北斗衛星導航系統(以下簡稱北斗系統)是中國著眼于國家安全和經濟社會發展需要,自主建設運行的全球衛星導航系統,是為全球用戶提供全天候、全天時、高精度的定位、導航和授時服務的國家重要時空基礎設施。 北斗系統提供服務以來,已在交通運輸、農林漁業、水文監…

Android之解決VideoView控件的進度條位置擺放問題和打開播放黑屏問題

1 問題 VideoView控件如何配合MediaController使用,就會顯示進度條,但是位置擺放在最底部,不是我們想要的結果 2、基本使用 private var mMediaController:MediaController? = nullfun playVedio() {mMediaController = MediaController(this as Activity)trashVideoView…