對(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)注