zoukankan      html  css  js  c++  java
  • 懒人神器之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 模板的更改,这时只要添加新的实体就会自动生成每个业务层的代码。

  • 相关阅读:
    Django之web本质
    Python之队列
    Python之阻塞IO模型与非阻塞IO模型
    *****Python之进程线程*****
    ***Python之UDP***
    Python之FTP实现
    Python之粘包
    Python之目录结构
    Python之套接字
    Linux内核分析:Linux内核启动流程分析
  • 原文地址:https://www.cnblogs.com/byvar/p/4527911.html
Copyright © 2011-2022 走看看