国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

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

2019-11-17 01:32:40
字體:
供稿:網(wǎng)友

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

  對(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
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 梧州市| 广安市| 宁陵县| 独山县| 民和| 巢湖市| 苏尼特右旗| 枞阳县| 手游| 遂川县| 宜君县| 修水县| 龙州县| 镇宁| 临洮县| 邯郸县| 通州区| 白朗县| 福泉市| 内黄县| 宿松县| 阿坝县| 武义县| 资阳市| 商都县| 健康| 仙游县| 峨眉山市| 泗水县| 邻水| 陆良县| 邹城市| 漳平市| 徐州市| 黄骅市| 禄劝| 隆安县| 宝坻区| 汪清县| 广灵县| 连南|