懒人神器之T4模板
最近遇到一个比较令人烦躁的问题,特别是对于我等懒癌末期者。实在难以忍受!具体问题是这样,这个项目是一个新的项目。使用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模板的更多相关文章
- 懒人小工具:T4自动生成Model,Insert,Select,Delete以及导出Excel的方法
之前写了篇文章,懒人小工具:[自动生成Model,Insert,Select,Delete以及导出Excel的方法](http://www.jianshu.com/p/d5b11589174a),但是 ...
- 懒人小工具:T4生成实体类Model,Insert,Select,Delete以及导出Excel的方法
由于最近公司在用webform开发ERP,用到大量重复机械的代码,之前写了篇文章,懒人小工具:自动生成Model,Insert,Select,Delete以及导出Excel的方法,但是有人觉得这种方法 ...
- 使用T4模板生成代码的学习
之前做项目使用的都是Db First,直接在项目中添加Entity Framework,使用T4模板(T4模板引擎之基础入门)生成DAL BLL层等(T4模板是一个同事给的,也没有仔细研究,代码如下: ...
- 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,这种形 ...
- 使用T4模板动态生成NPoco实体类
这是一个妥妥的NPoco类,这是我们在工作开发中,手动去写这个实体类,属实非常心累,字段少无所谓一次两次,数量多了,字段多了,就心态裂开
- 从零开始编写自己的C#框架(14)——T4模板在逻辑层中的应用(三)
原本关于T4模板原想分5个章节详细解说的,不过因为最近比较忙,也不想将整个系列时间拉得太长,所以就将它们整合在一块了,可能会有很多细节没有讲到,希望大家自己对着代码与模板去研究. 本章代码量会比较大, ...
- JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(四):自定义T4模板快速生成页面
前言:上篇介绍了下ko增删改查的封装,确实节省了大量的js代码.博主是一个喜欢偷懒的人,总觉得这些基础的增删改查效果能不能通过一个什么工具直接生成页面效果,啥代码都不用写了,那该多爽.于是研究了下T4 ...
- EF CodeFirst 使用T4模板 生成文件
小编是个实用主义者,并没有深入的去理解T4的原理.只是根据自己的需求,在博客园里的前辈哪里找的资料,结合自己的理解,在项目中使用了T4模板. 最近的项目用了他,很方便,节省了不少代码量. 想利用T4做 ...
- T4 模板自动生成带注释的实体类文件 - 只需要一个 SqlSugar.dll
生成实体就是这么简单,只要建一个T4文件和 文件夹里面放一个DLL. 使用T4模板教程 步骤1 创建T4模板 ,一定要自已新建,把T4代码复制进去,好多人因为用我现成的T4报错(原因不明) 点击添加文 ...
随机推荐
- HDU-2523 SORT AGAIN
http://acm.hdu.edu.cn/showproblem.php?pid=2523 学习哈希和注意i++,后要--i: SORT AGAIN Time Limit: 2000/1000 MS ...
- yml文件数据的简洁表达方法(Hashes to OpenStruct)
通过ruby编写测试脚本的时候,我还是喜欢采用yml来管理测试数据,就像以前的文章(Selenium WebDriver + Grid2 + RSpec之旅(五))提到的一样,但是在引用yml中的数据 ...
- 获得URl信息
public class GetUrlInfo { public static void printfInfo(URL url)throws Exception { ...
- Jackson中的那些坑
不符合驼峰规范的变量 “驼峰命名法”请自行百度.简单的来说就是变量的第一个单词以小写字母开始其他单词首字母大写,或者全部单词首字母都大写,分别称为“小驼峰”和“大驼峰” 比如一个符合驼峰规范命名的实体 ...
- Java Networking: InetAddress
The InetAddress is Java's representation of an IP address. Instances of this class are used together ...
- hdoj 1054 Strategic Game【匈牙利算法+最小顶点覆盖】
Strategic Game Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- Java intern()方法
intern()方法: public String intern() JDK源代码如下图: 返回字符串对象的规范化表示形式. 一个初始时为空的字符串池,它由类 String 私有地维护. 当调用 in ...
- Staitic(静态) 相关知识点介绍
一.什么是 Static? Static 关键字:表明一个成员变量或者是成员方法可以在没有所属的类的实例的情况下直接被访问 当成员被静态修饰后,就多了一个调用方式,除了可被对象调用外还可以直接被类名调 ...
- Android解析qq聊天记录表情
偶然在一个需求中需要解析qq聊天记录表情,表情的格式是以/开始,比如:你好啊?/微笑,在网上找了半天,也没能找到一个比较合适的,所以准备自己实现一下,首先要将表情图片和表情字符对上号,我想了几种解决方 ...
- [ES7] Descorator: evaluated & call order
When multiple decorators apply to a single declaration, their evaluation is similar to function comp ...