對於T4模板很多朋友都不太熟悉,它在項目開發中,會幫我們減輕很大的工作量,提升我們的開發效率,減少出錯概率。所以學好T4模板的應用,對於開發人員來說是非常重要的。
園子里對於T4模板的介紹與資料已經太多了,所以在這里我就不再詳細講述基礎知識了,只是說說T4模板在本框架中的具體應用與實踐。
一、創建邏輯層項目
二、添加引用
將之前添加的三個項目添加到引用
三、創建T4模板放置的文件夾,並命名為SubSonic
四、將Solution.DataAccess項目中SubSonic文件夾下的MultipleOutputHelper.ttinclude、Settings.ttinclude、SQLServer.ttinclude以及項目根目錄下的App.config四個文件復制到邏輯層對應的位置里,詳見下圖
五、SubSonic文件夾里創建Test.tt模板文件,用來練習T4模板的實踐
六、編寫T4模板實例,練習模板的使用
1、練習一
我們先添加幾行代碼
1 <#@ template language="C#" debug="false" hostspecific="True" #> 2 <#@ output extension=".cs" encoding="utf-8" #> 3 <#@ include file="SQLServer.ttinclude" #> 4 5 using System; 6 7 namespace <#=Namespace#> { 8 9 }
<#@ template language="C#" debug="false" hostspecific="True" #>是T4模板指令,說明使用的語言是C#,不開啟debug模式,並將名為 Host 的屬性添加到由文本模板生成的類中
<#@ output extension=".cs" encoding="utf-8" #>是T4模板的輸出指令,限制當前模板生成的文件擴展名為.cs,存儲格式為utf-8
<#@ include file="SQLServer.ttinclude" #>這是模板的工具類文件,使用 Include 指令在其他文本模板中包含此文件,本行代碼主要功能是將SQL操作的工具類(函數)包含到代碼
using System; 這是輸出在cs文件中顯示的文本信息,具體功能大家一看就明白了,不再解釋
namespace <#=Namespace#> 創建命名空間名稱,因為SQLServer.ttinclude文件里使用了<#@ include file="Settings.ttinclude" #>,將SubSonic3.0模板的配置信息也同時讀取了進來,所以可以直接使用Settings.ttinclude中設置的變量,用它來作為命名空間名稱,詳見下圖
也就是說,如果你想在模板中使用一些你想要的變量的話,可以在這些工具類或配置文件中進行定義
點擊保存后生成Test.cs文件內容:
2、練習二
通過練習一,我們明白了T4模板生成代碼的簡單原理,那么我們增加些實用的內容來看看模板運行的效果
先上代碼
1 <#@ template debug="false" hostspecific="True" language="C#" #> 2 <#@ output extension=".cs" encoding="utf-8" #> 3 <#@ include file="SQLServer.ttinclude" #> 4 5 using System; 6 7 namespace <#=Namespace#> { 8 <# 9 var tables = LoadTables(); 10 //遍歷所有表 11 foreach(var tbl in tables){ 12 #> 13 17 public class <#=tbl.CleanName#>Table { 18 /// <summary> 19 /// 表名 20 /// </summary> 21 public static string TableName { 22 get{ 23 return "<#=tbl.CleanName#>"; 24 } 25 } 26 } 27 <# 28 } 29 #> 30 }
var tables = LoadTables(); LoadTables()是SQLServer.ttinclude工具類中的函數,功能是獲取數據庫中所有表和字段(已修改了該文件的代碼,可以獲取到所有表與視圖)
foreach(var tbl in tables) 遍歷所有表
<#=tbl.CleanName#> 讀取表名稱
public class <#=tbl.CleanName#>Table 用表名稱+Table 做為類名
點擊保存后生成Test.cs文件內容:
3、練習三
通過上面練習,我們可以看到使用很簡單的幾行代碼,就可以非常方便的生成我們想要的代碼,減少我們復制粘貼的操作,當然上面生成的東西太簡單了,我們想通過本模板生成的類來減少強編碼,那么就需要獲取所有字段名稱出來
1 <#@ template debug="false" hostspecific="True" language="C#" #> 2 <#@ output extension=".cs" encoding="utf-8" #> 3 <#@ include file="SQLServer.ttinclude" #> 4 5 using System; 6 7 namespace <#=Namespace#> { 8 <# 9 var tables = LoadTables(); 10 //遍歷所有表 11 foreach(var tbl in tables){ 12 #> 13 14 public class <#=tbl.CleanName#>Table { 15 /// <summary> 16 /// 表名 17 /// </summary> 18 public static string TableName { 19 get{ 20 return "<#=tbl.CleanName#>"; 21 } 22 } 23 24 25 26 //新增代碼,循環遍歷表中的所有字段,創建相應的函數 27 <# 28 foreach(var col in tbl.Columns){ 29 #> 30 /// <summary> 31 /// <#=Replace(col.Description) #> 32 /// </summary> 33 public static string <#= col.Name #>{ 34 get{ 35 return "<#= col.Name #>"; 36 } 37 } 38 39 <# 40 } 41 #> 42 43 44 45 46 } 47 <# 48 } 49 #> 50 }
foreach(var col in tbl.Columns) 遍歷表中所有字段,獲取字段結構
<#=Replace(col.Description) #> 本代碼中通過col.Description來獲取字估注釋,Replace函數是將字段注釋(說明)里的換行符替換成對應格式
<#= col.Name #> 獲取字段名稱
點擊保存后生成Test.cs文件內容:
4、練習四
用完上面的練習是不是感覺很簡單呢。對於數據表比較少的情況下,這種生成是完全沒有問題的,但表多了以后都放在一個文件里,在DEBUG調試時就會出問題了,主要原因是代碼行數過大,所以我們有另外一種解決辦法,就是分文件生成
先上代碼(為了讓大家更好的理解,會將前面例子中的一些內容刪除掉)
1 <#@ template debug="false" hostspecific="True" language="C#" #> 2 <#@ output extension=".cs" encoding="utf-8" #> 3 <#@ include file="SQLServer.ttinclude" #> 4 <#@ include file="MultipleOutputHelper.ttinclude"#> 5 6 <# 7 //獲取所有表與視圖 8 var tables = LoadTables(); 9 //創建多文件生成實體 10 var manager = Manager.Create(Host, GenerationEnvironment); 11 12 //遍歷所有表 13 foreach(var tbl in tables){ 14 //判斷當前表名是否是禁用名稱(禁用的名稱可以在Settings.ttinclude文件的ExcludeTables字符串數據中進行添加) 15 if(!ExcludeTables.Contains(tbl.Name)) 16 { 17 // 設置輸出的文件名 18 manager.StartNewFile(tbl.ClassName+".cs"); 19 #> 20 using System; 21 22 namespace <#=Namespace#> { 23 24 } 25 26 27 <# 28 // 輸出文件結束 29 manager.EndBlock(); 30 } //if(!ExcludeTables.Contains(tbl.Name)) 判斷結束 31 32 }// end foreach 33 34 // 執行編譯,生成文件 35 manager.Process(true); 36 #>
<#@ include file="MultipleOutputHelper.ttinclude"#> 生成多文件工具類
var manager = Manager.Create(Host, GenerationEnvironment); 創建多文件生成實體
foreach(var tbl in tables) 遍歷所有表,這個放在using的前面,是因為每個單獨文件生成后都需要有using
其他新增內容在代碼中都有詳細注釋了,所以這里不再說明
點擊保存后生成Test.cs文件內容:
再來個完整的模板代碼
1 <#@ template debug="false" hostspecific="True" language="C#" #> 2 <#@ output extension=".cs" encoding="utf-8" #> 3 <#@ include file="SQLServer.ttinclude" #> 4 <#@ include file="MultipleOutputHelper.ttinclude"#> 5 6 <# 7 //獲取所有表與視圖 8 var tables = LoadTables(); 9 //創建多文件生成實體 10 var manager = Manager.Create(Host, GenerationEnvironment); 11 12 //遍歷所有表 13 foreach(var tbl in tables){ 14 //判斷當前表名是否是禁用名稱(禁用的名稱可以在Settings.ttinclude文件的ExcludeTables字符串數據中進行添加) 15 if(!ExcludeTables.Contains(tbl.Name)) 16 { 17 // 設置輸出的文件名 18 manager.StartNewFile(tbl.ClassName+".cs"); 19 #> 20 using System; 21 22 namespace <#=Namespace#> { 23 24 public class <#=tbl.CleanName#>Table { 25 /// <summary> 26 /// 表名 27 /// </summary> 28 public static string TableName { 29 get{ 30 return "<#=tbl.CleanName#>"; 31 } 32 } 33 34 <# 35 foreach(var col in tbl.Columns){ 36 #> 37 /// <summary> 38 /// <#=Replace(col.Description) #> 39 /// </summary> 40 public static string <#= col.Name #>{ 41 get{ 42 return "<#= col.Name #>"; 43 } 44 } 45 46 <# 47 } 48 #> 49 } 50 51 } 52 53 54 <# 55 // 輸出文件結束 56 manager.EndBlock(); 57 } //if(!ExcludeTables.Contains(tbl.Name)) 判斷結束 58 59 }// end foreach 60 61 // 執行編譯,生成文件 62 manager.Process(true); 63 #>
點擊保存后生成Test.cs文件內容:
下載地址:
版權聲明:
本文由AllEmpty原創並發布於博客園,歡迎轉載,未經本人同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,否則保留追究法律責任的權利。如有問題,可以通過1654937@qq.com 聯系我,非常感謝。
發表本編內容,只要主為了和大家共同學習共同進步,有興趣的朋友可以加加Q群:327360708 ,大家一起探討。
更多內容,敬請觀注博客:http://www.cnblogs.com/EmptyFS/