拥有自己的代码生成器—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
posted @ 2012-05-11 08:35  数据之巅  阅读(6144)  评论(14编辑  收藏  举报