最近遇到一个比较令人烦躁的问题,特别是对于我等懒癌末期者。实在难以忍受!具体问题是这样,这个项目是一个新的项目。使用EF框架来开发,那么在搭建架构时,当我们新加一个Entity时,就需要在每个层级添加一个对应的业务的类来进行相关联。那如果未来这个项目里的数据库中有新增1000个实体表甚至不止,那不得为此增加N个(算一算都想把项目毁了不做了)?岂不得剁手?!!

我觉得任何难题都不是个体户,它的背后都一定有一个解决的办法,只是我们要耐心去寻找。后来通过 Google 找到了微软开发的一种可以通过代码来读取模板,根据模板生成字符串文件。这说正式点可以是一种比较高效的代码自动生成技术,既 T4( Text Template Transformation Toolkit ) 模板。


接下来看下比较官方的解读:

T4,即4个T开头的英文字母组合:Text Template Transformation Toolkit。

T4文本模板,即一种自定义规则的代码生成器。根据业务模型可生成任何形式的文本文件或供程序调用的字符串。(模型以适合于应用程序域的形式包含信息,并且可以在应用程序的生存期更改)


个人认为有时看官方,比如MSDN上的解读感觉读了好像脑袋还是空的,所以基于这个硬伤,我觉得我在博客上写的文章都尽量通俗简单些,尽量不说的太官方。也便于网友的理解。

Demo入门:

接下来我们开始入门吧,为大家写个简单的T4模板。

这里我创建一个控制台项目,然后再创建一个文本模板:

创建完之后,你可以看到一个名为T4Demo.tt的文本模板,

这里我将输出的文件格式改为.cs,并在这里面输入一段代码看会方式什么有趣的事情。

在 T4 文本模板中如果要执行 c# 代码时,必须要加入 '<#[your c# code] #>'  。当我保存自动生成后,会自动产生 .cs 文件,并直接将模板中的 c# 代码执行生成。从这个简单的 Demo 来看,解决刚才项目中的难题就有了很大的思路了。

把这个思路引用到项目问题中

参考了 edmx 自动生成的 T4 模板,以下我动手写了一个 T4 模板:

 <#@ template language="C#" debug="false" hostspecific="true"#>
<#@ include file="EF.Utility.CS.ttinclude"#><#@
output extension=".cs"#> <# CodeGenerationTools code = new CodeGenerationTools(this);
MetadataLoader loader = new MetadataLoader(this);
CodeRegion region = new CodeRegion(this, );
MetadataTools ef = new MetadataTools(this); string inputFile = @"..\\LJ.OA.Model\\DataModel.edmx"; EdmItemCollection ItemCollection = loader.CreateEdmItemCollection(inputFile);
string namespaceName = code.VsNamespaceSuggestion(); EntityFrameworkTemplateFileManager fileManager = EntityFrameworkTemplateFileManager.Create(this); #> using LJ.OA.IDAL;
using LJ.OA.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace LJ.OA.DAL
{
<#
// Emit Entity Types
foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name))
{
//fileManager.StartNewFile(entity.Name + "RepositoryExt.cs");
//BeginNamespace(namespaceName, code);
#>
public partial class <#=entity.Name#>Dal:BaseDal<<#=entity.Name#>>,I<#=entity.Name#>Dal
{
}
<#}#>
}

T4 Demo

这里唯一要讲下的就是需要引用正确的 edmx 路径

string inputFile = @"..\\LJ.OA.Model\\DataModel.edmx";

当然,这个看你项目的位置了。至于路径怎么找,这里不提,你懂的。另外一点,也是特别重要的一点,在生成 T4 模板时,请先将类改成 partial .

最后根据每个业务层的需求来进行 T4 模板的更改,这时只要添加新的实体就会自动生成每个业务层的代码。

懒人神器之T4模板的更多相关文章

  1. 懒人小工具:T4自动生成Model,Insert,Select,Delete以及导出Excel的方法

    之前写了篇文章,懒人小工具:[自动生成Model,Insert,Select,Delete以及导出Excel的方法](http://www.jianshu.com/p/d5b11589174a),但是 ...

  2. 懒人小工具:T4生成实体类Model,Insert,Select,Delete以及导出Excel的方法

    由于最近公司在用webform开发ERP,用到大量重复机械的代码,之前写了篇文章,懒人小工具:自动生成Model,Insert,Select,Delete以及导出Excel的方法,但是有人觉得这种方法 ...

  3. 使用T4模板生成代码的学习

    之前做项目使用的都是Db First,直接在项目中添加Entity Framework,使用T4模板(T4模板引擎之基础入门)生成DAL BLL层等(T4模板是一个同事给的,也没有仔细研究,代码如下: ...

  4. C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入

    C# 嵌入dll   在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形 ...

  5. 使用T4模板动态生成NPoco实体类

    这是一个妥妥的NPoco类,这是我们在工作开发中,手动去写这个实体类,属实非常心累,字段少无所谓一次两次,数量多了,字段多了,就心态裂开

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

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

  7. JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(四):自定义T4模板快速生成页面

    前言:上篇介绍了下ko增删改查的封装,确实节省了大量的js代码.博主是一个喜欢偷懒的人,总觉得这些基础的增删改查效果能不能通过一个什么工具直接生成页面效果,啥代码都不用写了,那该多爽.于是研究了下T4 ...

  8. EF CodeFirst 使用T4模板 生成文件

    小编是个实用主义者,并没有深入的去理解T4的原理.只是根据自己的需求,在博客园里的前辈哪里找的资料,结合自己的理解,在项目中使用了T4模板. 最近的项目用了他,很方便,节省了不少代码量. 想利用T4做 ...

  9. T4 模板自动生成带注释的实体类文件 - 只需要一个 SqlSugar.dll

    生成实体就是这么简单,只要建一个T4文件和 文件夹里面放一个DLL. 使用T4模板教程 步骤1 创建T4模板 ,一定要自已新建,把T4代码复制进去,好多人因为用我现成的T4报错(原因不明) 点击添加文 ...

随机推荐

  1. ☀【CSS3】形状

    CSS3shapeshttp://www.css3shapes.com/ <!DOCTYPE html> <html lang="zh-CN"> <h ...

  2. sql server 2005+ 翻页

    select * from ( select row_number() over (order by dm) row,* from t_zycp where dm like '%4%' ) tmp

  3. win7重装系统的配置步骤

    0. 关闭休眠功能,在开始菜单的运行里输入powercfg -h off 指令,关闭休眠,此文件实际大小和物理内存是一样的,大约可以为C盘释放1-3G的空间. 1. 在Win7桌面上显示“我的电脑” ...

  4. 30个最常用css选择器解析

    转自:http://www.cnblogs.com/yiyuanke/archive/2011/10/22/CSS.html 你也许已经掌握了id.class.后台选择器这些基本的css选择器.但这远 ...

  5. extjs动态树 动态grid 动态列

    由于项目需要做一个动态的extjs树.列等等,简而言之,就是一个都是动态的加载功能, 自己琢磨了半天,查各种资料,弄了将近两个星期,终于做出来了 首先,想看表结构,我的这个功能需要主从两张表来支持 代 ...

  6. [辅助类]NHibernateHelper

    对于学习ORM的人来说,NHibernate简直就是福音啊,而且此中技术是相当成熟,在这里分享一个小东西 public class NHibernateHelper { //数据库连接字符串 publ ...

  7. __str__

    __str__是被print函数调用的,一般都是return一个什么东西.这个东西应该是以字符串的形式表现的.如果不是要用str()函数转换.当你打印一个类的时候,那么print首先调用的就是类里面的 ...

  8. HW4.21

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  9. ios 游戏《魂斗罗》 AL文件素材破解

    1.破解原理非常简单就是找png的8字节的前缀(baidu png 文件编码格式). 2.破解就图就可以看见了 3.这样一个个个的改是不是非常麻烦,所有我专门写了个py脚本在干这事!一步搞定! 源码如 ...

  10. linux 下信号处理命令trap && linux下各种信号的意义

    1.用途说明 trap是一个shell内建命令,它用来在脚本中指定信号如何处理.比如,按Ctrl+C会使脚本终止执行,实际上系统发送了SIGINT信号给脚本进程,SIGINT信号的默认处理方式就是退出 ...