懒人神器之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 }
这里唯一要讲下的就是需要引用正确的 edmx 路径
string inputFile = @"..\\LJ.OA.Model\\DataModel.edmx";
当然,这个看你项目的位置了。至于路径怎么找,这里不提,你懂的。另外一点,也是特别重要的一点,在生成 T4 模板时,请先将类改成 partial .
最后根据每个业务层的需求来进行 T4 模板的更改,这时只要添加新的实体就会自动生成每个业务层的代码。