Ⅰ 創建代碼生成器可以很簡單:如何通過T4模板生成代碼[下篇]
在《上篇》中我們通過T4模板為我們指定的數據表成功生成了我們需要的用於添加、修改和刪除操作的存儲過程。但是這是一種基於單個文件的解決方案,即我們必須為每一個生成的存儲過程建立一個模板。如果我們提供一種基於多文件的代碼生成方式,將會為編程人員帶來極大的便利。藉助於T4 ToolBox這個開源工具箱,多文件的SQL Generator的實現變得異常簡單。[文中的例子可以從這里下載]目錄
二、創建自定義的Generator
三、ProcereGenerator如何被使用?一、多文件代碼生成器會帶來多大的便利?我們先來直觀的感受一下較之《上篇》提供的單一文件的代碼生成器,基於多文件的代碼生成解決方案會為開發人員帶來多大的便利。 同樣對於《上篇》創建的數據表T_PRODUCT,之前我們為了生成三個不同的存儲過程,我們不得已需要創建3個不同的T4模板文件。實際上我們更需要的方式只需要創建一個T4模板,讓我們的SQL Generator自動為我們生成3個包含相應存儲過程的.sql附屬文件,如左圖所示(點擊看大圖)。有的時候,基於單個數據表的存儲過程生成方式我們依然覺得不方便。如果我們能夠在T4模板文件中指定的數據表的列表,讓我們的SQL Generator為列表的每一個數據表都生成CUD三個存儲過程,這樣的方式更加具有吸引力。如右圖所示(點擊看大圖),一個訂單模塊包含兩個具有主子關系的兩張表(T_ORDER和T_ORDER_DETAIL),現在我們在一個T4模板中指定這兩個表明,通過SQL Generator可以幫助我們生成6個包含存儲過程的.sql附屬文件。甚至有的時候我們連數據表列表都無需指定,讓SQL Generator為所有的表都生成相應的存儲過程。我的例子中沒有提供這樣的功能,但是實現自來不會存在任何問題。二、創建自定義的Generator在《上篇》中我創建了一個抽象的ProcereTemplate類,以及三個基於生成CUD存儲過程的具體ProcereTemplate:InsertProcereTemplate、UpdateProcereTemplate和DeleteProcereTemplate。它們都將直接服務於我們今天將要提供的基於多文件的SQL Generator。在《上篇》中,這四個Template分別定義在4個不同的TT文件中,3個具體的ProcereTemplate通過<#@include>指令將抽象ProcereTemplate模板文件包含過來。由於我們將要創建的T4模板將會使用到這四個類,如果我們用四個<#@include>指令將四個TT文件包含過來,由於T4引擎將會導致對ProcereTemplate的4次包含,最好將會導致變異問題。個人覺得這應該算是T4引擎解析包含關系的一個局限性,為了解決這個問題我們不得不抽象的ProcereTemplate和三個具體的ProcereTemplate都合並成一個TT文件。T4 ToolBox為類庫中為了提供了一個抽象的T4Toolbox.Generator類用於實現多文件的代碼生成。為此我們創建一個TT模板文件,定義了如下一個繼承自該類的ProcereGenerator。ProcereGenerator的核心是通過屬性Templates定義的類型為IEnumerable<ProcereTemplate>的ProcereTemplate列表,這個列表在存儲過程中進行初始化。而對於ProcereGenerator的構造函數,處理定義了一個表示資料庫連接字元串的databaseName的參數外,並以數組參數的形式指定了生成的存儲過程基於的數據表名的列表。<#@ import namespace="System.Collections.Generic" #><#@ include file="ProcereTemplate.tt" #><#@ include file="T4Toolbox.tt" #><#+publicclass ProcereGenerator : Generator{public IEnumerable<ProcereTemplate> Templates{get; private set;}public ProcereGenerator(string databaseName, paramsstring[] tableNames) {if(null == tableNames || tableNames.Length == 0) {thrownew ArgumentNullException("tableNames"); } this.Templates = InitlizeTemplates(databaseName,tableNames); }private IEnumerable<ProcereTemplate> InitlizeTemplates(string databaseName, string[] tableNames) { foreach(string tableName in tableNames) {yieldreturnnew InsertProcereTemplate(databaseName, tableName);yieldreturnnew UpdateProcereTemplate(databaseName, tableName);yieldreturnnew DeleteProcereTemplate(databaseName, tableName); } }protectedoverridevoid RunCore() {foreach(ProcereTemplate tempalte inthis.Templates) { tempalte.RenderToFile(tempalte.GetProcereName() + ".sql"); } }}#>真正的存儲過程的T-SQL腳本實現在重寫的RunCore中。由於具體的文本轉化邏輯都定義在了ProcereTemplate中了,所以在這里我們需要遍歷的ProcereTemplate集合中每一個Template對象,調用RenderToFile方法將相應的存儲過程的腳本寫入以存儲過程命名同名的.sql文件中。三、ProcereGenerator如何被使用?我們最後來看看我們創建的ProcereGenerator最終如何被應用於具體的代碼生成。其實很簡單,我們只需要創建相應的模板文件,通過<#@include>將定義ProcereGenerator類的TT文件包含近來,最後以代碼語句調用塊(<#StatementCode#>)的形式實力化該對象,並調用Run方法即可。在構造函數中指定資料庫連接字元串的名稱和數據表名的列表。下面是基於但表的T4模板。<#@ template language="C#" hostSpecific="true" debug="true" #><#@ include file="Templates\ProcereGenerator.tt" #><#new ProcereGenerator("TestDb","T_PRODUCT").Run();#>下面是基於多表的T4模板:<#@ template language="C#" hostSpecific="true" debug="true" #><#@ include file="Templates\ProcereGenerator.tt" #><#new ProcereGenerator("TestDb","T_ORDER","T_ORDER_DETAIL").Run();#>當你代碼生成工作執行之後,會多出一個與TT文件同名的附屬文件,你需要手工刪除掉它。從數據到代碼——通過代碼生成機制實現強類型編程[上篇]從數據到代碼——通過代碼生成機制實現強類型編程[下篇]從數據到代碼——基於T4的代碼生成方式創建代碼生成器可以很簡單:如何通過T4模板生成代碼?[上篇]
Ⅱ 准備英國T4簽證需要哪些材料
英國T4簽證屬於英國留學簽證,英國留學簽證材料主要有下面這些:
1、 CAS;
2 、護照(有簽名和復印件);
3 、語言成績單:需要雅思成績5.5分;
4 、學位證+畢業證;
5、本科/高中成績單;
6、存款證明(最好存款滿一月以上)。
a、根據相關政策的新調整:倫敦地區生活費用每年9000英鎊;其餘地區的生活費用證明每年8000英鎊。
b、資金證明倫敦地區:10000英鎊;非倫敦地區:9000英鎊
7 、簽證照片;
8、押金的收據管;
9、簽證申請表格。
(2)t4多文件擴展閱讀
注意事項
1、所申請的簽證是否可以成功,取決於相關國家使領館簽證官的直接審核結果;若最終發生拒簽狀況,申請人應自然接受此結果。
2、有關簽證資料上公布的簽證有效期和停留天數,僅做參考而非任何法定承諾,一切均以簽證官簽發的簽證內容, 為唯一依據。
3、需購買機票,建議出簽後再購買。
4、如果文件說明中沒有特別指出,對於所提交的每一份文件,包括護照生物信息頁(即有您照片的那一頁),都必須同時提供原件和復印件。