zoukankan      html  css  js  c++  java
  • 拥有自己的代码生成器—Newlife.XCode模板编写教程

            本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html

    Newlife XCode组件相关文章目录:http://www.cnblogs.com/asxinyu/p/4329747.html

      上一篇拥有自己的代码生成器—NewLife.XCode代码生成器分析简单的分析了Xcoder的原理,并通过快速调用模板引擎生成了代码,对调用引擎前后的注意事项也说了一下,本篇主要来介绍模板的编写及规则。上一篇已经贴出了 生成的代码,当然这个代码也是你编写模板之前需要考虑的,的确是要生成这个样子,然后才能去编写对应的模板。关于模板引擎的说明,Newlife团队的大石头有一篇博客很经典,大家可以去参考一下,  模版引擎XTemplate与代码生成器XCoder(源码) 理论性比较强一点,我只是实际操作一下。
    一、先来说说模板引擎的编译过程,下面是引用石头的总结啊:
    编译型模版引擎的处理过程:
    1,Process。采用正则分析模版语法,识别出来指令、代码、表达式、普通文本
    2,GenerateCode。根据分析结果,为每一个模板项(一个模板文件就是一个模板项)生成一个C#类,这里得出每个模板项是否被包含过,被包含过的模板项不会生成最终的C#类,仅用于被包含
    3,Compile。调用C#编译器编译各个C#类,形成一个程序集,如果打开调试,会在临时目录XTemp保存一份dll,如果编译出错,临时目录还会有生成的各个C#类文件,方便差错
    4,Render。经过编译,模版引擎已经准备就绪。调用某一个模板生成代码,实际上就是找到相应模板生成的Type,然后创建一个实例。这个实例自然继承自TemplateBase。然后传入参数,最后调用Render方法。Render的返回值,就是字符串结果。模板生成的代码里面,几乎全部在Render方法里面,里面主要就是一个StringBuilder,不断的拼接各项内容。
    编译型模版引擎,分析、生成模版代码、编译,这是一个非常耗时的过程,所以不能重复。
    XTemplate有完备的缓存机制,保证只会编译一次,然后每次Render就是标准的C#代码执行,拥有超越所有非编译型模版引擎的性能。

    二、再说说模板的语法,其实这个语法其实比较通用,也挺简单,只有关键的几点,但是背后的实现可能就不那么简单:
    1、模板是完全使用C#作为模版语言,把<##>标签外的文本内容当作字符串原样输出,而把<##>标签内作为C#代码执行,因此很容易理解。
    2、模板引擎中获取的数据值,传入的Data是一个字典集合,可以根据名称访问,任何获取变量值都要用 <#=  #>,例如<#= Data["NameSpace"]#>,获取字典中key为NameSpace的值,用来作为命名空间。<#= #>同样可以用来获取在模板中定义的的变量值。
    3、模板中变量的定义是在<# #>里面定义的,不要=号,定义的时候可以使用<#=#>来替代部分值。如
    < # string title = <#=Data["Title"]#>Name#>,这里组合一个字符串,可以在下面调用<#=Title#>
    3.另外模板中需要的循环等都要在<# #>里面,其他所有在<# #>都会原样输出。
    4.可以看到整个模板中就是这2个东西<##>和<#= #>,他们是关键,虽然没什么难度,但出错了,的确比较麻烦,很难改,当然模板引擎有调试功能,当然多写多改,就经验就好办了。下面来分析一段简单的模板,就是字段定义的,根据Data是一个键值对集合,来生成字段定义,键值对中Key是字段名称,value是字段类型。Data集合中还有2个其他的字段,不能包括在里面,那就是NameSpace和ClassName,所以生成字段的时候要把这2个排除在外,所以下面的循环中有一个判断。
     

    View Code
     1 namespace <#=Data["NameSpace"]#>
     2 {
     3     public class <#=Data["ClassName"]#>:WMIBase
     4     {
     5         #region 字段定义
     6         <# foreach(KeyValuePair<string,object> item in Data)
     7         {if((!item.Key.Contains("NameSpace"))||(!item.Key.Contains("ClassName")))
     8         {#>
     9         private <#=item.Value#> _<#=item.Key.ToLower()#> ;
    10        <#}
    11         }#>
    12         private ManagementObject _mo;
    13         #endregion

     上述代码生成的就是字段定义,可以对比上一篇博客中生成的代码,就是循环拼接的过程。

    当然模板引擎还有一个强大的功能,那就是调试,可以发现一些潜在的错误,使得更容易发现和修改错误。为了说明上面那段代码,我准备了一张说明的图,嘿嘿,理解不了,就多动手做一些简单的,就知道了,熟能生巧吗。先看模板说明和生产代码说明对比:  

    看看对应生成的代码

    至于传入的数据已经在上一篇拥有自己的代码生成器—NewLife.XCode代码生成器分析中提到了,过程应该比较清楚吧。有什么问题,可以提出来,大家交流交流。 

    新生命开发团队的相关信息,QQ群:1600800
    博客:http://nnhy.cnblogs.com
    论坛:http://www.53wb.com
  • 相关阅读:
    LVM扩容根分区
    vmware vsphere client 创建虚拟机
    虚拟机三种磁盘置备方式
    【转】VMWare vCenter 6.0安装配置
    【转】在VMware中为Linux系统安装VM-Tools的详解教程
    【转】虚拟化(五):vsphere高可用群集与容错
    【转】虚拟化(四):vsphere高可用功能前提-共享存储搭建
    虚拟化(三) -vsphere套件的安装注意及使用
    虚拟化(二)-VMware workstation
    虚拟化(一) -VMware产品介绍
  • 原文地址:https://www.cnblogs.com/asxinyu/p/2495353.html
Copyright © 2011-2022 走看看