從零開始編寫自己的C#框架(12)——T4模板在邏輯層中的應用(一)(附源碼)


  對於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文件內容:

  

 

 

 

 

 下載地址:

T4模板在邏輯層中的應用(一).rar

 

 

 版權聲明:

  本文由AllEmpty原創並發布於博客園,歡迎轉載,未經本人同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,否則保留追究法律責任的權利。如有問題,可以通過1654937@qq.com 聯系我,非常感謝。

  發表本編內容,只要主為了和大家共同學習共同進步,有興趣的朋友可以加加Q群:327360708 ,大家一起探討。

  更多內容,敬請觀注博客:http://www.cnblogs.com/EmptyFS/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM