(一)什么是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[];
List<string> list = new List<string>();
if (dt!=null&&dt.Rows.Count>)
{
for (int i = ; 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[];
List<string> list = new List<string>();
if (dt!=null&&dt.Rows.Count>)
{
for (int i = ; 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[];
List<string> list = new List<string>();
if (dt!=null&&dt.Rows.Count>)
{
for (int i = ; 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[];
List<string> list = new List<string>();
if (dt!=null&&dt.Rows.Count>)
{
for (int i = ; 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);
#>

用T4生成EF框架下的DAL、IDAL、BLL、IBLL的更多相关文章

  1. EF框架下的双表查询

    最近想使用ef做一些开发但是遇到了一些小问题就是如何实现多表的查询然后经过查资料终于找出了结果 我们知道ef中表的关系是一对一  一对多  多对多 接下来就讲一下一对一的关系下的栗子 先编写两个表 第 ...

  2. .NET MVC EF框架数据库连接配置

    1:数据库的配置和连接 Web.config <connectionStrings> <add name="SQLConnectionString" connec ...

  3. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) ...

  4. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(12)-实现用户异步登录和T4模板

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(12)-实现用户异步登录和T4模板 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建  ...

  5. MVC实战之排球计分(六)—— 使用EF框架,创建Controller,生成数据库。

    在上篇博客我们写到,此软件的数据库连接我们使用的是EF框架,code first模式下, 通过模型类,在创建controller的时候直接生成数据库,完成数据库的连接,与操作. 在使用EF框架之前,我 ...

  6. windows下扩展yaf,并生成yaf框架文件

    YAF中文文档:http://www.laruence.com/manual/index.html 1 YAF框架是用C开发的,属于PHP的扩展框架: 2 YAF的性能相对于源生PHP,性能只降低不到 ...

  7. 【EF框架】EF DBFirst 快速生成数据库实体类 Database1.tt

    现有如下需求,数据库表快速映射到数据库实体类 VS给出的两个选择都有问题,并不能实现,都是坑啊 EF .x DbContext 生成器 EF .x DbContext 生成器 测试结果如下 生成文件 ...

  8. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(9)-TT模板的学习

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(9)-TT模板的学习 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2): ...

  9. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(10)- VSS源代码管理

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(10)- VSS源代码管理 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    ( ...

随机推荐

  1. String trim() ,去除当前字符串两边的空白字符

    package seday01;/** * String trim() * 去除当前字符串两边的空白字符 * @author xingsir */public class TrimDemo { pub ...

  2. MySQL学习——查看数据库信息

    MySQL学习——查看数据库信息 摘要:本文主要学习了查看数据库信息的方法. 查询指定表的索引 语法 show index from 表名; 示例 mysql> show index from ...

  3. C# virtual 和 abstract 区别

    Virtual方法(虚方法) virtual 关键字用于在基类中修饰方法.virtual的使用会有两种情况: 情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法.那么在对派生类实例 ...

  4. kali linux查看局域网下所有IP,并对指定IP实施局域网内攻击(断网,随时查看对方密码,上网痕迹等)

    首先我们打开我们熟悉的kali linux操作系统,利用指令: ifconfig 来确认本机的ip地址 确认了本机的ip地址之后,利用一下的指令查看局域网下所有ip: fping -g 本机IP地址/ ...

  5. java:数据结构(四)二叉查找树以及树的三种遍历

    @TOC 二叉树模型 二叉树是树的一种应用,一个节点可以有两个孩子:左孩子,右孩子,并且除了根节点以外每个节点都有一个父节点.当然这种简单的二叉树不能解决让树保持平衡状态,例如你一直往树的左边添加元素 ...

  6. 巡风扫描器web界面工作流程

    这两周学习了巡风扫描器的搭建,也在学长的带领下看了各部分的下源代码,为了加深记忆,梳理一下巡风大体的工作流程,主要通过web端的页面分析,错误的地方还请大佬们多多指正. 整体看一下巡风的扫描流程:登陆 ...

  7. pyse基本操作命令一

    #coding=utf-8import timefrom selenium import webdriver dr = webdriver.Chrome()# dr = webdriver.Ie()d ...

  8. insertAdjacentHTML和insertAdjacentText的使用(在指定位置插入代码或者文字)

    insertAdjacentText方法与insertAdjacentHTML方法类似,只不过只能插入纯文本,参数相同.

  9. [LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机

    [LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机 题意 给定平面上的 \(n\) 个整点 \((x_i,y_i)\), 一共有两个问题. 第一个问题是从原 ...

  10. Linux应试技巧

    前言:此文是为了CSP-S第二轮认证所用系统NOI-Linux的写的,但其他的Linux系统也可以按照相同或类似的方法进行配置. 配置NOI-Linux 我大约是一个月以前由于比赛的原因才开始接触NO ...