(一)什么是T4模板?
T4,即4个T开头的英文字母组合:Text Template Transformation Toolkit。
T4文本模板,即一种自定义规则的代码生成器。根据业务模型可生成任何形式的文本文件或供程序调用的字符串。(模型以适合于应用程序域的形式包含信息,并且可以在应用程序的生存期更改)
(二)T4基本结构
T4模板可以分为:指令块、文本块、控制块。
指令块 - 向文本模板化引擎提供关于如何生成转换代码和输出文件的一般指令。
文本块 - 直接复制到输出的内容。
控制块 - 向文本插入可变值并控制文本的条件或重复部件的程序代码,不能在控制块中嵌套控制块。
(三)设计时模板和运行时模板
T4文本模板分为:设计时模板和运行时模板
(四)技巧
快速编写模板:
用T4生成EF框架下的DAL、IDAL、BLL、IBLL 四层为例:
DAL:
<#@ template debug="true" hostspecific="true" language="C#" #> <#@ template language="C#" debug="false" hostspecific="true"#> <#@ output extension=".cs" #> <#@ assembly name="System.Data" #> <#@ assembly name="D:\hua\code\Hua\Dll\MySql.Data.dll"#> <#@ assembly name="System.Xml" #> <#@ import namespace="System" #> <#@ import namespace="System.Xml" #> <#@ import namespace="System.Data" #> <#@ import namespace="MySql.Data.MySqlClient" #> <#@ import namespace="System.Collections.Generic"#> <#@ Import Namespace="System.Text" #> <#@ import namespace="System.IO" #> <#@ Import Namespace="System.Reflection"#> <#@ include file="../Manager.ttinclude" #> <# var manager = Manager.Create(Host, GenerationEnvironment); MySqlConnection con = new MySqlConnection(""); DataTable dt; MySqlCommand cmd = con.CreateCommand(); cmd.CommandText = "SELECT TABLE_NAME FROM USER_TABLES"; cmd.CommandType = CommandType.Text; MySqlDataAdapter adapter = new MySqlDataAdapter(cmd); DataSet ds = new DataSet(); adapter.Fill(ds); dt = ds.Tables[0]; List<string> list = new List<string>(); if (dt!=null&&dt.Rows.Count>0) { for (int i = 0; i < dt.Rows.Count; i++) { list.Add(dt.Rows[i]["TABLE_NAME"].ToString()); } } foreach (var item in list) { string tableName=item; #> <# manager.StartNewFile("D_"+tableName+".cs"); #> using Model; using IDAL; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DAL { public class D_<#=tableName#> : D_Base<<#=tableName#>>,ID_<#=tableName#> { } } <# // 结束输出文件 manager.EndBlock(); } // 执行编译 manager.Process(true); #>
IDAL
<#@ template debug="true" hostspecific="true" language="C#" #> <#@ template language="C#" debug="false" hostspecific="true"#> <#@ output extension=".cs" #> <#@ assembly name="System.Data" #> <#@ assembly name="D:\hua\code\Hua\Dll\MySql.Data.dll"#> <#@ assembly name="System.Xml" #> <#@ import namespace="System" #> <#@ import namespace="System.Xml" #> <#@ import namespace="System.Data" #> <#@ import namespace="MySql.Data.MySqlClient" #> <#@ import namespace="System.Collections.Generic"#> <#@ Import Namespace="System.Text" #> <#@ import namespace="System.IO" #> <#@ Import Namespace="System.Reflection" #> <#@ include file="../Manager.ttinclude" #> <# var manager = Manager.Create(Host, GenerationEnvironment); MySqlConnection con = new MySqlConnection(""); DataTable dt; MySqlCommand cmd = con.CreateCommand(); cmd.CommandText = "SELECT TABLE_NAME FROM USER_TABLES"; cmd.CommandType = CommandType.Text; MySqlDataAdapter adapter = new MySqlDataAdapter(cmd); DataSet ds = new DataSet(); adapter.Fill(ds); dt = ds.Tables[0]; List<string> list = new List<string>(); if (dt!=null&&dt.Rows.Count>0) { for (int i = 0; i < dt.Rows.Count; i++) { list.Add(dt.Rows[i]["TABLE_NAME"].ToString()); } } foreach (var item in list) { string tableName=item; #> <# manager.StartNewFile("ID_"+tableName+".cs"); #> using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace IDAL { public interface ID_<#=tableName#> : ID_Base<Model.<#=tableName#>> { } } <# // 结束输出文件 manager.EndBlock(); } // 执行编译 manager.Process(true); #>
BLL
<#@ template debug="true" hostspecific="true" language="C#" #> <#@ template language="C#" debug="false" hostspecific="true"#> <#@ output extension=".cs" #> <#@ assembly name="System.Data" #> <#@ assembly name="D:\hua\code\Hua\Dll\MySql.Data.dll"#> <#@ assembly name="System.Xml" #> <#@ import namespace="System" #> <#@ import namespace="System.Xml" #> <#@ import namespace="System.Data" #> <#@ import namespace="MySql.Data.MySqlClient" #> <#@ import namespace="System.Collections.Generic"#> <#@ Import Namespace="System.Text" #> <#@ import namespace="System.IO" #> <#@ Import Namespace="System.Reflection"#> <#@ include file="../Manager.ttinclude" #> <# var manager = Manager.Create(Host, GenerationEnvironment); MySqlConnection con = new MySqlConnection(""); DataTable dt; MySqlCommand cmd = con.CreateCommand(); cmd.CommandText = "SELECT TABLE_NAME FROM USER_TABLES"; cmd.CommandType = CommandType.Text; MySqlDataAdapter adapter = new MySqlDataAdapter(cmd); DataSet ds = new DataSet(); adapter.Fill(ds); dt = ds.Tables[0]; List<string> list = new List<string>(); if (dt!=null&&dt.Rows.Count>0) { for (int i = 0; i < dt.Rows.Count; i++) { list.Add(dt.Rows[i]["TABLE_NAME"].ToString()); } } foreach (var item in list) { string tableName=item; #> <# manager.StartNewFile("B_"+tableName+".cs"); #> using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Model; using IDAL; using IBLL; namespace BLL { public class B_<#=tableName#> : B_Base<<#=tableName#>>, IB_<#=tableName#> { private ID_<#=tableName#> nowDAL = DALContainer.UnityIOC.Resolve<ID_<#=tableName#>>(); public override void SetDal() { Dal = nowDAL; } } } <# // 结束输出文件 manager.EndBlock(); } // 执行编译 manager.Process(true); #>
IBLL
<#@ template debug="true" hostspecific="true" language="C#" #> <#@ template language="C#" debug="false" hostspecific="true"#> <#@ output extension=".cs" #> <#@ assembly name="System.Data" #> <#@ assembly name="D:\hua\code\Hua\Dll\MySql.Data.dll" #> <#@ assembly name="System.Xml" #> <#@ import namespace="System" #> <#@ import namespace="System.Xml" #> <#@ import namespace="System.Data" #> <#@ import namespace="MySql.Data.MySqlClient" #> <#@ import namespace="System.Collections.Generic"#> <#@ Import Namespace="System.Text" #> <#@ import namespace="System.IO" #> <#@ Import Namespace="System.Reflection" #> <#@ include file="../Manager.ttinclude" #> <# var manager = Manager.Create(Host, GenerationEnvironment); MySqlConnection con = new MySqlConnection(""); DataTable dt; MySqlCommand cmd = con.CreateCommand(); cmd.CommandText = "SELECT TABLE_NAME FROM USER_TABLES"; cmd.CommandType = CommandType.Text; MySqlDataAdapter adapter = new MySqlDataAdapter(cmd); DataSet ds = new DataSet(); adapter.Fill(ds); dt = ds.Tables[0]; List<string> list = new List<string>(); if (dt!=null&&dt.Rows.Count>0) { for (int i = 0; i < dt.Rows.Count; i++) { list.Add(dt.Rows[i]["TABLE_NAME"].ToString()); } } foreach (var item in list) { string tableName=item; #> <# manager.StartNewFile("IB_"+tableName+".cs"); #> using Model; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace IBLL { public interface IB_<#=tableName#> : IB_Base<<#=tableName#>> { } } <# // 结束输出文件 manager.EndBlock(); } // 执行编译 manager.Process(true); #>