从零开始编写本身的C#框架(12)——T4模板在逻辑层中的应用(一)(附源码)

  对于T4模板不少朋友都不太熟悉,它在项目开发中,会帮咱们减轻很大的工做量,提高咱们的开发效率,减小出错几率。因此学好T4模板的应用,对于开发人员来讲是很是重要的。数据库

  园子里对于T4模板的介绍与资料已经太多了,因此在这里我就再也不详细讲述基础知识了,只是说说T4模板在本框架中的具体应用与实践。并发

 

  1、建立逻辑层项目框架

  

  

 

  2、添加引用函数

  

  将以前添加的三个项目添加到引用工具

  

 

  3、建立T4模板放置的文件夹,并命名为SubSonic学习

  

 

  4、将Solution.DataAccess项目中SubSonic文件夹下的MultipleOutputHelper.ttinclude、Settings.ttinclude、SQLServer.ttinclude以及项目根目录下的App.config四个文件复制到逻辑层对应的位置里,详见下图ui

  

 

  5、SubSonic文件夹里建立Test.tt模板文件,用来练习T4模板的实践this

  

  

  

 

  6、编写T4模板实例,练习模板的使用编码

  一、练习一spa

  咱们先添加几行代码  

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文件内容:

  

  二、练习二

  经过练习一,咱们明白了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文件内容:

  

 

  三、练习三

  经过上面练习,咱们能够看到使用很简单的几行代码,就能够很是方便的生成咱们想要的代码,减小咱们复制粘贴的操做,固然上面生成的东西太简单了,咱们想经过本模板生成的类来减小强编码,那么就须要获取全部字段名称出来

  

 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文件内容:

  

  

 

  四、练习四

  用完上面的练习是否是感受很简单呢。对于数据表比较少的状况下,这种生成是彻底没有问题的,但表多了之后都放在一个文件里,在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/

相关文章
相关标签/搜索