现在的位置: 首页 > 综合 > 正文

CodeSmith技术原理初探

2013年10月01日 ⁄ 综合 ⁄ 共 2358字 ⁄ 字号 评论关闭

CodeSmith技术原理初探.

初次听说CodeSmith是在一篇叫做<每个开发人员现在应该下载的十种必备工具>的文章,起初CodeSmith给我的印象不是吸引人.也是在去年的某一段相对比较空闲的时候,抽空尝试了一下CodeSmith,才发现CodeSmith确实是一个好东西.使用过CodeSmith之后,才发现它的实现原理其实不是很复杂,它从Asp.Net的语法中借鉴了不少,应该说CodeSmith实现了Asp.net一部分功能(从aspx模板生成html脚本)的伪Asp.net,只是CodeSmith额外提供了属性申明的功能.以下是对CodeSmith实现原理的简略概述:
1/  支持执行代码块语法  ,与 Asp.net语法一模一样
2/  支持内联表达式语法  ,与 Asp.net语法一模一样
3/  支持Code Behind功能(,与 Asp.net的()类似
4/  支持 函数代码块功能,  与Asp.net的函数代码块功能 类似
5/ 支持属性申明,用于配置模板的属性.  Asp.net语法不支持.

关于CodeSmith如何通过模板生成代码的问题, 我们只要了解一下Asp.net如何通过Aspx文件生成Html脚本的过程就可以明了.其实Asp.net生成Html脚本过程远比CodeSmith复杂的多,因为Asp.net还要呈现ServerControl的Html脚本.而CodeSmith只专注于 "执行代码块"  "内联表达式"  " 函数代码块"的文法分析及转换.  该文法分析的逻辑也相对简单(和Asp.net一模一样),具体过程如下:
1/  产生一个类Class1(以模板文件名作为类名),默认从CodeTemplate类继承,如果有Code Behind,那么就从Code Behind标记的父类继承(该父类必须从CodeTemplate类继承)
2/  根据所申明的属性,在Class1中添加相应的属性申明及成员变量代码
3/  把模板文件中的 函数代码块中的函数体 原封不动的拷贝到Class1中,作为Class1的成员函数
4/  开始生成Class1的核心函数体:__RenderMethod1(System.IO.TextWriter writer, CodeSmith.Engine.Control control),按顺序把模板文件中的执行代码块中的代码块(不包括字符'')原封不动的移植到__RenderMethod1中,把模板文件中不属于执行代码块 及内联表达式的Code转换成writer.Write("Code");把模板文件中的内联表达式的表达式expression转换成writer.Write(expression).
5/  编译所生成的类Class1
6/  调用类Class1的__RenderMethod1函数,产生实际代码(就好像Asp.net中,Asp.net的运行框架对于每个Request,都产生Html脚本).

通过以上分析,大家就觉得CodeSmith的实现原理相对比较简单,和Asp.net的产生Html脚本的原理基本一致(大家可以比较一下CodeSmith产生的Compiled Source和Asp.net的Page Compilation Source).  到此位置, 就有人会想,如果没有CodeSmith,可否通过Asp.net代替CodeSmith来使用?当然答案是完全肯定的.只是CodeSmith带给我们比较多的便利(比如访问DBSchema功能函数,属性值设置等等,直接编译并生成Code),而使用Asp.net作为代码生成器相对比较复杂(起码要创建一个Web虚拟目录,设计一个Aspx模板文件,用IE请求获得asp.net生成的HTML脚本)并且还要添加一些类似CodeSmith扩展功能,工作量也是不小的,有兴趣的朋友可以尝试一下.

另外补充说明一下在CodeSmith2.6版本中, 编译错误的错误代码行数是指Compiled Source的行数,而不是指原来的模板文件中的行数, 在CodeSmith 3.0中已经是指向原来的模板文件中的行数(这点已经和Asp.net的Page Compilation Source一模一样了, 通过预处理命令:#line实现的  )

一些好的CodeSmith的模板文件可以从http://www.ericjsmith.net/codesmith/forum/default.aspx?f=16&p=1&ord=vd下载...

 

共享自动生成DTO/DataAccess/BizObject的CodeSmith模板
如果你有什么代码模板,可以与我们共享吗,我打算搞一个CodeSmith模板共享的团队,共享我们的模板(CodeSmith论坛上已经有很多了)。
只要你点击一下按钮,DTO对象及其集合类、数据访问类、业务层类的部分代码自动生成,形成Model、DataAccess、Biz三个目录,并生成相应的各个类文件。
MyTemplates.rar

前提:
1、建立数据库的各个表,最好以复数形式给表命名。
2、设定表的主键。
3、设定表的外键。
4、建立表的索引。

主要特点:
1、支持一对多和多对一关系。
2、支持like查询。

用法:
1、完成"前提"中提到的各步。
2、用AllStoredProcedures.cst生成所有存储过程
3、用Model/Bulk.cst生成所有文件

不足:
1、刚建立,还没来的及详细测试。
2、模板里的ModelObject.cst还没有用
3、BizObject.cst还没有发布。
(里面虽然有制作自己的EnterpriseLibrary应用程序块的模板但没有内容,过段时间在给出)

大家有什么好的架构,我可以帮着建立模板,同时希望对我建立的这个模板提出更多的意见。

 
 
 

抱歉!评论已关闭.