懒人神器之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 模板:

 1 <#@ template language="C#" debug="false" hostspecific="true"#>
 2 <#@ include file="EF.Utility.CS.ttinclude"#><#@
 3  output extension=".cs"#>
 4  
 5 <#
 6 
 7 CodeGenerationTools code = new CodeGenerationTools(this);
 8 MetadataLoader loader = new MetadataLoader(this);
 9 CodeRegion region = new CodeRegion(this, 1);
10 MetadataTools ef = new MetadataTools(this);
11 
12 string inputFile = @"..\\LJ.OA.Model\\DataModel.edmx";
13 
14 EdmItemCollection ItemCollection = loader.CreateEdmItemCollection(inputFile);
15 string namespaceName = code.VsNamespaceSuggestion();
16 
17 EntityFrameworkTemplateFileManager fileManager = EntityFrameworkTemplateFileManager.Create(this);
18 
19 #>
20 
21 using LJ.OA.IDAL;
22 using LJ.OA.Model;
23 using System;
24 using System.Collections.Generic;
25 using System.Linq;
26 using System.Text;
27 
28 namespace LJ.OA.DAL
29 {  
30 <#
31 // Emit Entity Types
32 foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name))
33 {
34     //fileManager.StartNewFile(entity.Name + "RepositoryExt.cs");
35     //BeginNamespace(namespaceName, code);    
36 #>    
37     public partial class <#=entity.Name#>Dal:BaseDal<<#=entity.Name#>>,I<#=entity.Name#>Dal
38     {
39     }
40 <#}#>
41 }
T4 Demo

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

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

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

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

 

posted @ 2015-05-25 15:11  许大虾  阅读(1697)  评论(0编辑  收藏  举报