(一)什么是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. java核心技术第二篇之数据库SQL语法

    #查询products表记录SELECT * FROM products WHERE price > 2000;-- 单行注释/* 多行注释*/#创建数据库CREATE DATABASE hei ...

  2. django7-cookie与session

    1.有状态服务与无状态服务 服务实例存储了客户端的数据 ,那么这就是个有状态服务 服务实例不存储客户端数据 ,让其他缓存存储客户端数据 ,这就是无状态服务 ,http就是无状态的 2.什么是cooki ...

  3. vue-cli3和element做一个简单的登陆页面

    1.先用vue-cli3创建一个项目 2.安装element模块 全局安装 npm i element-ui -S 3在main.js引入模块 import ElementUI from 'eleme ...

  4. 什么是POSP?系统逻辑是什么?pos收单必读

    POSProxy,POS前置系统.主要用于管理前端的POS机具和交易的转发,具体功能有:   1. POS机具的密钥及下载管理:   2. 交易的合法检测和过滤:   3. 交易监控和分流:   4. ...

  5. Mysql—索引原理与详解

    索引的原理 索引的优点和缺点和使用原则 索引优点: 可以加快数据的检索速度,提高查询速度. 所有的MySql列类型(字段类型)都可以被索引,也就是可以给任意字段建立索引. 全文检索字段进行搜索优化. ...

  6. 封装查找元素以及集成日志输出,Base模块

    关于查找元素封装,Base模块 """ Selenium 封装基类 封装查找元素以及集成日志输出 """ from HTMLReport i ...

  7. UML图示样例

  8. ACM-后序遍历(简单方法和正规方法)

    1.后序遍历简单方法 /**二叉树遍历一般有三种方法:前序,中序,后序.*其中前序遍历u顺序为:根->左子树->右子树,在此定义一种新的遍历方法:根->右子树->左子u树*使用 ...

  9. oracle 分组拼接

    方法一:listagg, 参考链接,从oracle11g后出现的新函数 如果拼接的字符串长度超过4000字节,会报ora-01489错误,ora-01489 字符串连接的结果过长 解决方案. SELE ...

  10. Jsoup+HttpUnit爬取搜狐新闻

    怎么说呢,静态的页面,但我也写了动态的接口支持,方便后续爬取别的新闻网站使用. 一个接口,接口有一个抽象方法pullNews用于拉新闻,有一个默认方法用于获取新闻首页: public interfac ...