·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> ASP.NET网站开发 >> 从零开始编写自己的C#框架(13)——T4模板在逻辑层中的应用(二)

从零开始编写自己的C#框架(13)——T4模板在逻辑层中的应用(二)

作者:佚名      ASP.NET网站开发编辑:admin      更新时间:2022-07-23

从零开始编写自己的C#框架(13)——T4模板在逻辑层中的应用(二)

  最近这段时间特忙,公事私事,忙得有时都没时间打开电脑了,这两周只能尽量更新,以后再将章节补回来。

  直接进入主题,通过上一章节,大家明白了怎么使用模板类编写T4模板,本章进的是一些简单技巧的应用

  1、首先创建一个Test2.tt模板

  

  2、然后修改模板内容为下面代码

  这些代码与上一章最后面的那个差不多,只是修改了输出文件名、命名空间、类名、类属性(partial)和一个单例获取函数

 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+"Bll.cs");19 #> 20 using System;21 22 namespace Solution.Logic {23 24     public partial class <#=tbl.CleanName#>Bll {25         26         #region 单例模式27         //定义单例实体28         PRivate static <#=tbl.Name#>Bll _<#=tbl.Name#>Bll = null;29 30         /// <summary>31         /// 获取本逻辑类单例32         /// </summary>33         /// <returns></returns>34         public static <#=tbl.Name#>Bll GetInstence() {35             if (_<#=tbl.Name#>Bll == null) {36                 _<#=tbl.Name#>Bll = new <#=tbl.Name#>Bll();37             }38             return _<#=tbl.Name#>Bll;39         }40         #endregion41         42     }43 44 }45 46 47 <# 48             // 输出文件结束49             manager.EndBlock();50         } //if(!ExcludeTables.Contains(tbl.Name)) 判断结束51        52     }// end foreach53 54     // 执行编译,生成文件55     manager.Process(true);  56 #> 

  运行模板,测试看看效果

  

  

  从上面添加函数的方法可以看出,对于常用的函数,都可以在模板中进行添加后,直接生成出来,这样就减少了程序员很大的工作量了

  3、用上面方法确实可以解决很大部分的问题,但对于一些特殊的函数直接这样写就不行了,比如我们想生成一个删除指定外键Id的函数,由于有的表有外键有的没有,那么就要用上一些简单的判断来处理了

  

 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+"Bll.cs");19 #> 20 using System;21 using Solution.Dataaccess.DataModel;22 using Solution.DataAccess.DbHelper;23 24 namespace Solution.Logic {25 26     public partial class <#=tbl.CleanName#>Bll {27         28         #region 单例模式29         //定义单例实体30         private static <#=tbl.Name#>Bll _<#=tbl.Name#>Bll = null;31 32         /// <summary>33         /// 获取本逻辑类单例34         /// </summary>35         /// <returns></returns>36         public static <#=tbl.Name#>Bll GetInstence() {37             if (_<#=tbl.Name#>Bll == null) {38                 _<#=tbl.Name#>Bll = new <#=tbl.Name#>Bll();39             }40             return _<#=tbl.Name#>Bll;41         }42         #endregion43         44             45 <#46         foreach(var col in tbl.Columns){47             //判断字段名称中是否包含“_Id”这个字符串,且字段类型为int或long的,则生成对应的删除函数48             if (col.CleanName.IndexOf("_Id") >= 0  && (col.SysType == "int" || col.SysType == "long"))49             {50 #>51         #region 删除<#=tbl.Name#>表指定<#=col.CleanName#>的字段值记录52         /// <summary>53         /// 删除<#=tbl.Name#>表指定<#=col.CleanName#>的字段值记录54         /// </summary>55         /// <param name="id">记录的主键值</param>56         public void DeleteBy<#=col.CleanName#>(int id) {57             //删除58             <#=tbl.Name#>.Delete(x => x.<#=col.CleanName#> == id);59         }60 61         /// <summary>62         /// 删除<#=tbl.Name#>表指定<#=col.CleanName#>的字段值记录63         /// </summary>64         /// <param name="id">记录的主键值</param>65         public void DeleteBy<#=col.CleanName#>(int[] id) {66             if (id == null) return;67             //将数组转为逗号分隔的字串68             var str = string.Join(",", id);69 70             //设置Sql语句71             var sql = "delete from <#=tbl.Name#> where <#=col.CleanName#> in (" + str + ")";72 73             //删除74             var deleteHelper = new DeleteHelper();75             deleteHelper.Delete(sql);76         }77         #endregion78 79 <#80             }81         }82 #>83     }84 85 }86 87 88 <# 89             // 输出文件结束90             manager.EndBlock();91         } //if(!ExcludeTables.Contains(tbl.Name)) 判断结束92        93     }// end foreach94 95     // 执行编译,生成文件96     manager.Process(true);  97 #> 

  运行模板,测试看看效果

  

  

  4、同理,我们可以通过判断,生成获取指定名称的字段值和生成删除图片函数等,这些都可以根据你的需要去生成

  

  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+"Bll.cs"); 19 #>  20 using System; 21 using Solution.DataAccess.DataModel; 22 using Solution.DataAccess.DbHelper; 23  24 namespace Solution.Logic { 25  26     public partial class <#=tbl.CleanName#>Bll { 27          28         #region 单例模式 29         //定义单例实体 30         private static <#=tbl.Name#>Bll _<#=tbl.Name#>Bll = null; 31  32         /// <summary> 33         /// 获取本逻辑类单例 34         /// </summary> 35         /// <returns></returns> 36         public static <#=tbl.Name#>Bll GetInstence() { 37             if (_<#=tbl.Name#>Bll == null) { 38                 _<#=tbl.Name#>Bll = new <#=tbl.Name#>Bll(); 39             } 40             return _<#=tbl.Name#>Bll; 41         } 42         #endregion 43          44 <# 45         foreach(var col in tbl.Columns){ 46             //判断字段名称中是否包含“_Id”这个字符串,且字段类型为int或long的,则生成对应的删除函数 47             if (col.CleanName.IndexOf("_Id") >= 0  && (col.SysType == "int" || col.SysType == "long")) 48             { 49 #> 50         #region 删除<#=tbl.Name#>表指定<#=col.CleanName#>的字段值记录 51         /// <summary> 52         /// 删除<#=tbl.Name#>表指定<#=col.CleanName#>的字段值记录 53         /// </summary> 54         /// <param name="id">记录的主键值</param> 55         public void DeleteBy<#=col.CleanName#>(int id) { 56             //删除 57             <#=tbl.Name#>.Delete(x => x.<#=col.CleanName#> == id); 58         } 59  60         /// <summary> 61         /// 删除<#=tbl.Name#>表指定<#=col.CleanName#>的字段值记录 62         /// </summary> 63         /// <param name="id">记录的主键值</param> 64         public void DeleteBy<#=col.CleanName#>(int[] id) { 65             if (id == null) return; 66             //将数组转为逗号分隔的字串 67             var str = string.Join(",", id); 68  69             //设置Sql语句 70