对于T4模板很多朋友都不太熟悉,它在项目开发中,会帮我们减轻很大的工作量,提升我们的开发效率,减少出错概率。所以学好T4模板的应用,对于开发人员来说是非常重要的。

  园子里对于T4模板的介绍与资料已经太多了,所以在这里我就不再详细讲述基础知识了,只是说说T4模板在本框架中的具体应用与实践。

  一、创建逻辑层项目

  

  

  二、添加引用

  

  将之前添加的三个项目添加到引用

  

  三、创建T4模板放置的文件夹,并命名为SubSonic

  

  四、将Solution.DataAccess项目中SubSonic文件夹下的MultipleOutputHelper.ttinclude、Settings.ttinclude、SQLServer.ttinclude以及项目根目录下的App.config四个文件复制到逻辑层对应的位置里,详见下图

  

  五、SubSonic文件夹里创建Test.tt模板文件,用来练习T4模板的实践

  

  

  

  六、编写T4模板实例,练习模板的使用

  1、练习一

  我们先添加几行代码  

 <#@ template language="C#" debug="false" hostspecific="True" #>
<#@ output extension=".cs" encoding="utf-8" #>
<#@ include file="SQLServer.ttinclude" #> using System; namespace <#=Namespace#> { }

  <#@ template language="C#" debug="false" hostspecific="True" #>是T4模板指令,说明使用的语言是C#,不开启debug模式,并将名为 Host 的属性添加到由文本模板生成的类中

  <#@ output extension=".cs" encoding="utf-8" #>是T4模板的输出指令,限制当前模板生成的文件扩展名为.cs,存储格式为utf-8

  <#@ include file="SQLServer.ttinclude" #>这是模板的工具类文件,使用 Include 指令在其他文本模板中包含此文件,本行代码主要功能是将SQL操作的工具类(函数)包含到代码

  using System; 这是输出在cs文件中显示的文本信息,具体功能大家一看就明白了,不再解释

  namespace <#=Namespace#>  创建命名空间名称,因为SQLServer.ttinclude文件里使用了<#@ include file="Settings.ttinclude" #>,将SubSonic3.0模板的配置信息也同时读取了进来,所以可以直接使用Settings.ttinclude中设置的变量,用它来作为命名空间名称,详见下图

    

  也就是说,如果你想在模板中使用一些你想要的变量的话,可以在这些工具类或配置文件中进行定义

  点击保存后生成Test.cs文件内容:

  

  2、练习二

  通过练习一,我们明白了T4模板生成代码的简单原理,那么我们增加些实用的内容来看看模板运行的效果

  先上代码

 <#@ template debug="false" hostspecific="True" language="C#" #>
<#@ output extension=".cs" encoding="utf-8" #>
<#@ include file="SQLServer.ttinclude" #> using System; namespace <#=Namespace#> {
<#
var tables = LoadTables();
//遍历所有表
foreach(var tbl in tables){
#> public class <#=tbl.CleanName#>Table {
/// <summary>
/// 表名
/// </summary>
public static string TableName {
get{
return "<#=tbl.CleanName#>";
}
}
}
<#
}
#>
}

  var tables = LoadTables();  LoadTables()是SQLServer.ttinclude工具类中的函数,功能是获取数据库中所有表和字段(已修改了该文件的代码,可以获取到所有表与视图)

  foreach(var tbl in tables)  遍历所有表

  <#=tbl.CleanName#>  读取表名称

  public class <#=tbl.CleanName#>Table  用表名称+Table 做为类名

  点击保存后生成Test.cs文件内容:

  

  3、练习三

  通过上面练习,我们可以看到使用很简单的几行代码,就可以非常方便的生成我们想要的代码,减少我们复制粘贴的操作,当然上面生成的东西太简单了,我们想通过本模板生成的类来减少强编码,那么就需要获取所有字段名称出来

  

 <#@ template debug="false" hostspecific="True" language="C#" #>
<#@ output extension=".cs" encoding="utf-8" #>
<#@ include file="SQLServer.ttinclude" #> using System; namespace <#=Namespace#> {
<#
var tables = LoadTables();
//遍历所有表
foreach(var tbl in tables){
#> public class <#=tbl.CleanName#>Table {
/// <summary>
/// 表名
/// </summary>
public static string TableName {
get{
return "<#=tbl.CleanName#>";
}
} //新增代码,循环遍历表中的所有字段,创建相应的函数
<#
foreach(var col in tbl.Columns){
#>
/// <summary>
/// <#=Replace(col.Description) #>
/// </summary>
public static string <#= col.Name #>{
get{
  return "<#= col.Name #>";
}
} <#
}
#> }
<#
}
#>
}

  foreach(var col in tbl.Columns)  遍历表中所有字段,获取字段结构

  <#=Replace(col.Description) #>  本代码中通过col.Description来获取字估注释,Replace函数是将字段注释(说明)里的换行符替换成对应格式

  <#= col.Name #>  获取字段名称

  点击保存后生成Test.cs文件内容:

  

  

  4、练习四

  用完上面的练习是不是感觉很简单呢。对于数据表比较少的情况下,这种生成是完全没有问题的,但表多了以后都放在一个文件里,在DEBUG调试时就会出问题了,主要原因是代码行数过大,所以我们有另外一种解决办法,就是分文件生成

  先上代码(为了让大家更好的理解,会将前面例子中的一些内容删除掉)

 

 <#@ template debug="false" hostspecific="True" language="C#" #>
<#@ output extension=".cs" encoding="utf-8" #>
<#@ include file="SQLServer.ttinclude" #>
<#@ include file="MultipleOutputHelper.ttinclude"#> <#
//获取所有表与视图
var tables = LoadTables();
//创建多文件生成实体
var manager = Manager.Create(Host, GenerationEnvironment); //遍历所有表
foreach(var tbl in tables){
//判断当前表名是否是禁用名称(禁用的名称可以在Settings.ttinclude文件的ExcludeTables字符串数据中进行添加)
if(!ExcludeTables.Contains(tbl.Name))
{
// 设置输出的文件名
manager.StartNewFile(tbl.ClassName+".cs");
#>
using System; namespace <#=Namespace#> { } <#
// 输出文件结束
manager.EndBlock();
} //if(!ExcludeTables.Contains(tbl.Name)) 判断结束 }// end foreach // 执行编译,生成文件
manager.Process(true);
#>

  <#@ include file="MultipleOutputHelper.ttinclude"#>  生成多文件工具类

  var manager = Manager.Create(Host, GenerationEnvironment);   创建多文件生成实体

  foreach(var tbl in tables)  遍历所有表,这个放在using的前面,是因为每个单独文件生成后都需要有using

  其他新增内容在代码中都有详细注释了,所以这里不再说明

  点击保存后生成Test.cs文件内容:

  

  

  再来个完整的模板代码

  

 <#@ template debug="false" hostspecific="True" language="C#" #>
<#@ output extension=".cs" encoding="utf-8" #>
<#@ include file="SQLServer.ttinclude" #>
<#@ include file="MultipleOutputHelper.ttinclude"#> <#
//获取所有表与视图
var tables = LoadTables();
//创建多文件生成实体
var manager = Manager.Create(Host, GenerationEnvironment); //遍历所有表
foreach(var tbl in tables){
//判断当前表名是否是禁用名称(禁用的名称可以在Settings.ttinclude文件的ExcludeTables字符串数据中进行添加)
if(!ExcludeTables.Contains(tbl.Name))
{
// 设置输出的文件名
manager.StartNewFile(tbl.ClassName+".cs");
#>
using System; namespace <#=Namespace#> { public class <#=tbl.CleanName#>Table {
/// <summary>
/// 表名
/// </summary>
public static string TableName {
get{
return "<#=tbl.CleanName#>";
}
} <#
foreach(var col in tbl.Columns){
#>
/// <summary>
/// <#=Replace(col.Description) #>
/// </summary>
public static string <#= col.Name #>{
get{
return "<#= col.Name #>";
}
} <#
}
#>
} } <#
// 输出文件结束
manager.EndBlock();
} //if(!ExcludeTables.Contains(tbl.Name)) 判断结束 }// end foreach // 执行编译,生成文件
manager.Process(true);
#>

  点击保存后生成Test.cs文件内容:

  

 下载地址:

T4模板在逻辑层中的应用(一).rar

 版权声明:

  本文由AllEmpty原创并发布于博客园,欢迎转载,未经本人同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。如有问题,可以通过1654937@qq.com 联系我,非常感谢。

  发表本编内容,只要主为了和大家共同学习共同进步,有兴趣的朋友可以加加Q群:327360708 ,大家一起探讨。

  更多内容,敬请观注博客:http://www.cnblogs.com/EmptyFS/

从零开始编写自己的C#框架(12)——T4模板在逻辑层中的应用(一)(附源码)的更多相关文章

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

    原本关于T4模板原想分5个章节详细解说的,不过因为最近比较忙,也不想将整个系列时间拉得太长,所以就将它们整合在一块了,可能会有很多细节没有讲到,希望大家自己对着代码与模板去研究. 本章代码量会比较大, ...

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

    最近这段时间特忙,公事私事,忙得有时都没时间打开电脑了,这两周只能尽量更新,以后再将章节补回来. 直接进入主题,通过上一章节,大家明白了怎么使用模板类编写T4模板,本章进的是一些简单技巧的应用 1.首 ...

  3. 手把手教你基于SqlSugar4编写一个可视化代码生成器(生成实体,以SqlServer为例,文末附源码)

    在开发过程中免不了创建实体类,字段少的表可以手动编写,但是字段多还用手动创建的话不免有些浪费时间,假如一张表有100多个字段,手写有些不现实. 这时我们会借助一些工具,如:动软代码生成器.各种ORM框 ...

  4. 从零开始编写自己的C#框架(1)——前言

    记得十五年前自学编程时,拿着C语言厚厚的书,想要上机都不知道要用什么编译器来执行书中的例子.十二年前在大学自学ASP时,由于身边没有一位同学和朋友学习这种语言,也只能整天混在图收馆里拼命的啃书.而再后 ...

  5. 从零开始编写自己的C#框架 ---- 系列文章

    目录: 从零开始编写自己的C#框架(1)——前言从零开始编写自己的C#框架(2)——开发前的准备工作从零开始编写自己的C#框架(3)——开发规范从零开始编写自己的C#框架(4)——文档编写说明从零开始 ...

  6. 从零开始编写自己的C#框架(17)——Web层后端首页

    后端首页是管理员登陆后进入的第一个页面,主要是显示当前登陆用户信息.在线人数.菜单树列表.相关功能按键和系统介绍.让管理员能更方便的找到息想要的内容. 根据不同系统的需要,首页会显示不同的内容,比如显 ...

  7. 从零开始编写自己的C#框架(26)——小结

    一直想写个总结,不过实在太忙了,所以一直拖啊拖啊,拖到现在,不过也好,有了这段时间的沉淀,发现自己又有了小小的进步.哈哈...... 原想框架开发的相关开发步骤.文档.代码.功能.部署等都简单的讲过了 ...

  8. 从零开始编写自己的C#框架(25)——网站部署

    导航 1.关掉访问保护 2.发布网站 3.复制网站到服务器 4.添加新网站 5.设置网站访问权限 6.设置文件夹访问权限 7.控制可更新文件夹执行权限 8.设置“应用程序池”.net版本与模式 9.附 ...

  9. 从零开始编写自己的C#框架(15)——Web层后端登陆功能

    对于一个后端管理系统,最重要内容之一的就是登陆页了,无论是安全验证.用户在线记录.相关日志记录.单用户或多用户使用帐号控制等,都是在这个页面进行处理的. 1.在解决方案中创建一个Web项目,并将它设置 ...

随机推荐

  1. 避免重复造轮子的UI自动化测试框架开发

    一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...

  2. 关于ubuntu实机与虚机互相copy

    我的开发环境是在ubuntu上的,但是ubuntu上没有官方支持的QQ,有些不太方便,所以在上面虚了一个Win7(先是win10,但是win10最新版本太坑了,不说了),不过经常会出现复制文件,或者文 ...

  3. .net core快速上手

    2014年11月12日的Connect ();开发者活动上宣布将.NET堆栈基于MIT协议开源,并且提供开源保证,托管在Github上.当时的版本与最终目标相距甚远,然而有一点可以肯定的是,这是一个与 ...

  4. C# MVC 5 - 生命周期(应用程序生命周期&请求生命周期)

    本文是根据网上的文章总结的. 1.介绍 本文讨论ASP.Net MVC框架MVC的请求生命周期. MVC有两个生命周期,一为应用程序生命周期,二为请求生命周期. 2.应用程序生命周期 应用程序生命周期 ...

  5. 免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)

    在生活中有一种东西几乎已经快要成为我们的另一个电子”身份证“,那就是二维码.无论是在软件开发的过程中,还是在普通用户的日常中,几乎都离不开二维码.二维码 (dimensional barcode) , ...

  6. 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  7. Win10 UWP开发系列——开源控件库:UWPCommunityToolkit

    在开发应用的过程中,不可避免的会使用第三方类库.之前用过一个WinRTXamlToolkit.UWP,现在微软官方发布了一个新的开源控件库—— UWPCommunityToolkit 项目代码托管在G ...

  8. Lind.DDD.LindAspects方法拦截的介绍

    回到目录 什么是LindAspects 之前写了关于Aspects的文章<Lind.DDD.Aspects通过Plugins实现方法的动态拦截~Lind里的AOP>,今天主要在设计思想上进 ...

  9. css样式之超出隐藏

    文本超出部分隐藏,总结两种方法. 1.单行隐藏 html代码 <div class="mi">当文字超过范围的时候,超出部分会隐藏起来.</div> css ...

  10. iOS开源项目周报1222

    由OpenDigg 出品的iOS开源项目周报第二期来啦.我们的iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开发方面的开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等. io ...