从零开始编写自己的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 #endregion
41
42 }
43
44 }
45
46
47 <#
48 // 输出文件结束
49 manager.EndBlock();
50 } //if(!ExcludeTables.Contains(tbl.Name)) 判断结束
51
52 }// end foreach
53
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 #endregion
43
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