對(duì)于T4模板很多朋友都不太熟悉,它在項(xiàng)目開發(fā)中,會(huì)幫我們減輕很大的工作量,提升我們的開發(fā)效率,減少出錯(cuò)概率。所以學(xué)好T4模板的應(yīng)用,對(duì)于開發(fā)人員來說是非常重要的。
園子里對(duì)于T4模板的介紹與資料已經(jīng)太多了,所以在這里我就不再詳細(xì)講述基礎(chǔ)知識(shí)了,只是說說T4模板在本框架中的具體應(yīng)用與實(shí)踐。
一、創(chuàng)建邏輯層項(xiàng)目


二、添加引用

將之前添加的三個(gè)項(xiàng)目添加到引用

三、創(chuàng)建T4模板放置的文件夾,并命名為SubSonic

四、將Solution.Dataaccess項(xiàng)目中SubSonic文件夾下的MultipleOutputHelper.ttinclude、Settings.ttinclude、SQLServer.ttinclude以及項(xiàng)目根目錄下的App.config四個(gè)文件復(fù)制到邏輯層對(duì)應(yīng)的位置里,詳見下圖

五、SubSonic文件夾里創(chuàng)建Test.tt模板文件,用來練習(xí)T4模板的實(shí)踐



六、編寫T4模板實(shí)例,練習(xí)模板的使用
1、練習(xí)一
我們先添加幾行代碼
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模板指令,說明使用的語(yǔ)言是C#,不開啟debug模式,并將名為 Host 的屬性添加到由文本模板生成的類中
<#@ output extension=".cs" encoding="utf-8" #>是T4模板的輸出指令,限制當(dāng)前模板生成的文件擴(kuò)展名為.cs,存儲(chǔ)格式為utf-8
<#@ include file="SQLServer.ttinclude" #>這是模板的工具類文件,使用 Include 指令在其他文本模板中包含此文件,本行代碼主要功能是將SQL操作的工具類(函數(shù))包含到代碼
using System; 這是輸出在cs文件中顯示的文本信息,具體功能大家一看就明白了,不再解釋
namespace <#=Namespace#> 創(chuàng)建命名空間名稱,因?yàn)镾QLServer.ttinclude文件里使用了<#@ include file="Settings.ttinclude" #>,將SubSonic3.0模板的配置信息也同時(shí)讀取了進(jìn)來,所以可以直接使用Settings.ttinclude中設(shè)置的變量,用它來作為命名空間名稱,詳見下圖

也就是說,如果你想在模板中使用一些你想要的變量的話,可以在這些工具類或配置文件中進(jìn)行定義
點(diǎn)擊保存后生成Test.cs文件內(nèi)容:

2、練習(xí)二
通過練習(xí)一,我們明白了T4模板生成代碼的簡(jiǎn)單原理,那么我們?cè)黾有?shí)用的內(nèi)容來看看模板運(yùn)行的效果
先上代碼
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工具類中的函數(shù),功能是獲取數(shù)據(jù)庫(kù)中所有表和字段(已修改了該文件的代碼,可以獲取到所有表與視圖)
foreach(var tbl in tables) 遍歷所有表
<#=tbl.CleanName#> 讀取表名稱
public class <#=tbl.CleanName#>Table 用表名稱+Table 做為類名
點(diǎn)擊保存后生成Test.cs文件內(nèi)容:

3、練習(xí)三
通過上面練習(xí),我們可以看到使用很簡(jiǎn)單的幾行代碼,就可以非常方便的生成我們想要的代碼,減少我們復(fù)制粘貼的操作,當(dāng)然上面生成的東西太簡(jiǎn)單了,我們想通過本模板生成的類來減少?gòu)?qiáng)編碼,那么就需要獲取所有字段名稱出來
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 //新增代碼,循環(huán)遍歷表中的所有字段,創(chuàng)建相應(yīng)的函數(shù)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) 遍歷表中所有字段,獲取字段結(jié)構(gòu)
<#=Replace(col.Description) #> 本代碼中通過col.Description來獲取字估注釋,Replace函數(shù)是將字段注釋(說明)里的換行符替換成對(duì)應(yīng)格式
<#= col.Name #> 獲取字段名稱
點(diǎn)擊保存后生成Test.cs文件內(nèi)容:


4、練習(xí)四
用完上面的練習(xí)是不是感覺很簡(jiǎn)單呢。對(duì)于數(shù)據(jù)表比較少的情況下,這種生成是完全沒有問題的,但表多了以后都放在一個(gè)文件里,在DEBUG調(diào)試時(shí)就會(huì)出問題了,主要原因是代碼行數(shù)過大,所以我們有另外一種解決辦法,就是分文件生成
先上代碼(為了讓大家更好的理解,會(huì)將前面例子中的一些內(nèi)容刪除掉)
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 //創(chuàng)建多文件生成實(shí)體10 var manager = Manager.Create(Host, GenerationEnvironment); 11 12 //遍歷所有表13 foreach(var tbl in tables){14 //判斷當(dāng)前表名是否是禁用名稱(禁用的名稱可以在Settings.ttinclude文件的ExcludeTables字符串?dāng)?shù)據(jù)中進(jìn)行添加)15 if(!ExcludeTables.Contains(tbl.Name))16 {17 // 設(shè)置輸出的文件名18 manager.StartNewFile(tbl.ClassName+".cs");19 #> 20 using System;21 22 namespace <#=Namespace#> {23 24 }25 26 27 <# 28 // 輸出文件結(jié)束29 manager.EndBlock();30 } //if(!ExcludeTables.Contains(tbl.Name)) 判斷結(jié)束31 32 }// end foreach33 34 // 執(zhí)行編譯,生成文件35 manager.PRocess(true); 36 #> <#@ include file="MultipleOutputHelper.ttinclude"#> 生成多文件工具類
var manager = Manager.Create(Host, GenerationEnvironment); 創(chuàng)建多文件生成實(shí)體
foreach(var tbl in tables) 遍歷所有表,這個(gè)放在using的前面,是因?yàn)槊總€(gè)單獨(dú)文件生成后都需要有using
其他新增內(nèi)容在代碼中都有詳細(xì)注釋了,所以這里不再說明
點(diǎn)擊保存后生成Test.cs文件內(nèi)容:


再來個(gè)完整的模板代碼
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 //創(chuàng)建多文件生成實(shí)體10 var manager = Manager.Create(Host, GenerationEnvironment); 11 12 //遍歷所有表13 foreach(var tbl in tables){14 //判斷當(dāng)前表名是否是禁用名稱(禁用的名稱可以在Settings.ttinclude文件的ExcludeTables字符串?dāng)?shù)據(jù)中進(jìn)行添加)15 if(!ExcludeTables.Contains(tbl.Name))16 {17 // 設(shè)置輸出的文件名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
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注