1. 創建代碼生成器可以很簡單:如何通過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的代碼生成方式
2. 如何:使用文本模板 ...
生成部分應用程序代碼我在文件或資料庫中具有配置或模型。我的代碼的一個或多個部分依賴於該模型。從文本模板生成一些代碼文件。有關更多信息,請參見使用T4 文本模板生成設計時代碼和開始編寫模板的最佳方式是什麼?。在運行時生成文件,將數據傳遞到模板在運行時,應用程序生成包含標准文本和數據混合的文本文件,例如報告。我要避免編寫數以百計的 write 語句。將預處理過的文本模板添加到項目。此模板在代碼中創建類,您可以實例化該類並用於生成文本。您可以在構造函數參數中將數據傳遞給它。有關更多信息,請參見使用預處理 T4 文本模板生成運行時文本。如果要從只可在運行時使用的模板生成,則可以使用標准文本模板。如果要編寫 Visual Studio 擴展,則可以調用文本模板化服務。有關更多信息,請參見在VS 擴展中調用文本轉換。在其他上下文中,可以使用文本模板化引擎。有關更多信息,請參見 Microsoft.VisualStudio.TextTemplating.Engine。使用<#@parameter#> 指令將參數傳遞給這些模板。有關更多信息,請參見 T4 參數指令。從模板讀取另一個項目文件。若要從與模板相同的 Visual Studio 項目中讀取文件,請執行以下操作:將hostSpecific="true" 插入<#@template#> 指令。在代碼中,使用 this.Host.ResolvePath(filename) 獲取文件的完整路徑。從模板調用方法例如,如果方法已經存在於標准 .NET Framework 類中:使用<#@assembly#> 指令載入程序集,並使用 <#@import#> 設置命名空間上下文。有關更多信息,請參見 T4 導入指令。如果您經常使用一組相同的程序集和導入指令,請考慮編寫指令處理器。在每個模板中,可以調用指令處理器,它可以載入程序集和模型文件並設置命名空間上下文。有關更多信息,請參見創建自定義文本模板指令處理器。如果您要親自編寫方法:如果您要編寫預處理過的文本模板,則編寫與預處理過的文本模板具有相同名稱的分部類定義。將其他方法添加到此類中。編寫類功能控制塊 <#+ ... #>,可以在其中聲明方法、屬性和私有類。編譯文本模板後,它將轉換為一個類。標准控制塊 <#...#> 和文本將轉換為單個方法,類功能塊將作為單獨成員插入。有關更多信息,請參見T4 文本模板控制塊。定義為類功能的方法還可以包括嵌入文本塊。請考慮在單獨文件中放置類功能,該文件可以 <#@include#> 到一個或多個模板文件中。在單獨程序集(類庫)中編寫方法並從您的模板調用它們。使用<#@assembly#> 指令載入程序集,使用 <#@import#> 設置命名空間上下文。請注意,為了在調試程序集時重新生成該程序集,您可能必須停止並重新啟動 Visual Studio。有關更多信息,請參見 T4 文本模板指令。從一個模型架構生成許多文件如果經常從具有同一 XML 或資料庫架構的模型中生成文件:考慮編寫指令處理器。這使您能夠在每個具有單一自定義指令的模板中替換多個程序集語句和導入語句 。指令處理器還可以載入和分析模型文件。有關更多信息,請參見創建自定義文本模板指令處理器。從復雜的模型生成文件考慮創建域特定語言 (DSL) 來表示該模型。這樣更加容易編寫模板,因為您使用類型和屬性來反映模型中元素的名稱。不必分析文件或導航 XML 節點。例如:foreach (Book book in this.Library) { ... } 有關更多信息,請參見域特定語言入門和從域特定語言生成代碼。考慮從 UML 模型生成代碼。代碼不必直接反映 UML。例如,不必為 UML 模型中的每個類都生成一個類。相反,可使用 UML 類圖來表示網站,並從每個 UML 類生成網頁。選擇最符合您需要的關系圖類型。例如,選擇活動圖來表示任意類型的工作流。可以定義構造型以便將適合應用程序的信息添加到每種類型的元素。通過從 UML 模型生成,您可以圖表形式繪制並編輯模型,但不必像使用 DSL 一樣設計您自己的關系圖類型。有關更多信息,請參見開發軟體設計模型和如何:從 UML 模型生成文件。從Visual Studio 獲取數據若要使用 Visual Studio 中提供的服務,請設置 hostSpecific 特性並載入 EnvDTE 程序集。例如:C# <#@ template hostspecific="true" language="C#" #> <#@ output extension=".txt" #> <#@ assembly name="EnvDTE" #> <# IServiceProvider serviceProvider = (IServiceProvider)this.Host; EnvDTE.DTE dte = (EnvDTE.DTE) serviceProvider.GetService(typeof(EnvDTE.DTE)); #> Number of projects inthis VS solution: <#= dte.Solution.Projects.Count #> 調試模板代碼在<#@template#> 指令中插入 debug="true",並保存文件。如果出現異常,則可以逐句通過模板。普通斷點在模板中不起作用,但是您可以插入 System.Diagnostics.Debugger.Launch() 來打開調試器。如果要檢查生成的代碼,它將出現在 %TEMP% 目錄中。有關更多信息,請參見使用文本模板時的常見錯誤和警告。在生成過程中執行文本模板有關更多信息,請參見生成過程中的代碼生成。
3. 英國T4簽證是什麼 英國T4簽證材料清單
英國T4簽證是學生簽證,辦理英國T4簽證所需材料如下:
1、在線簽證申請材料清單列印件。
2、有效的旅行文件或護照,其中必須包含至少一頁雙面都是空白面的頁面。
3、錄取確認函(CAS)號(在簽證申請表中提供)。
4、由授權診所開具的肺結核檢測證明(停留超過6個月)。
5、學術技術審核證書(如果學校錄取確認函中要求提交)。
6、仍然有效的舊生物信息卡(如果持有需提供)。
在線申請當日未滿18歲歲的第四層級(普通)申請人需要提交的額外材料:
父(母)或法定監護人的書面同意函,同意前往英國以及抵英接送安排。同意函還必須說明父(母)或法定監護人同意你在英國獨立生活;以及你和父(母)或法定監護人的關系證明: 出生證、戶口、獨生子女證、領養證(如果你被領養)。
如果無法提供以上任何材料證明和父(母)或法定監護人的關系,可以提交由授權機構出具的DNA檢測結果。英國簽證及移民局不接受中國相關部門開具的公證書。
(3)t4模板多文件擴展閱讀
入境英國的注意事項:
中國公民入境英國時,要隨身攜帶有效護照、簽證、機票,以及與入境目的有關的入學通知書、邀請函、資金證明或在英聯系人住址、聯系方式等文件證明,以便邊境移民官員查驗。切勿將這些材料放在托運行李中。
在辦理入境手續時,應如實回答英國移民官員問詢;如不懂英文或不能正確理解移民官提出的問題,可以請求英方提供中文翻譯;如認為受到不公正對待,應當向英移民官當面表達意見,同時要求與中國駐英國使、領館聯系。
英國入境移民口岸設有3種通道:英國護照通道(BritishPassports)、歐盟國家通道(EUCountries)和其他護照通道(OtherPassports)。中國公民應當選擇「其他護照通道」辦理入境手續。
4. 准備英國T4簽證需要哪些材料
英國T4簽證屬於英國留學簽證,英國留學簽證材料主要有下面這些:
1、 CAS;
2 、護照(有簽名和復印件);
3 、語言成績單:需要雅思成績5.5分;
4 、學位證+畢業證;
5、本科/高中成績單;
6、存款證明(最好存款滿一月以上)。
a、根據相關政策的新調整:倫敦地區生活費用每年9000英鎊;其餘地區的生活費用證明每年8000英鎊。
b、資金證明倫敦地區:10000英鎊;非倫敦地區:9000英鎊
7 、簽證照片;
8、押金的收據管;
9、簽證申請表格。
(4)t4模板多文件擴展閱讀
注意事項
1、所申請的簽證是否可以成功,取決於相關國家使領館簽證官的直接審核結果;若最終發生拒簽狀況,申請人應自然接受此結果。
2、有關簽證資料上公布的簽證有效期和停留天數,僅做參考而非任何法定承諾,一切均以簽證官簽發的簽證內容, 為唯一依據。
3、需購買機票,建議出簽後再購買。
4、如果文件說明中沒有特別指出,對於所提交的每一份文件,包括護照生物信息頁(即有您照片的那一頁),都必須同時提供原件和復印件。