也谈代码生成器
关于代码生成器 Teddy's Knowledge Base 兄在博客园上已经谈过几次了,如他的也谈orm和代码生成和没有ORM或代码生成数据就不能持久化了? - 用范型技术代替代码生成! 等,今天我不谈代码生成器的意义,只谈代码生成器的设计方案,最后给一个DEMO供大家下载.
代码生成器的用途一般是根据表自动生成(Model,存储过程,Dao,Biz,UI(html,asp,aspx,jsp,winForm ....))等,分析其特性代码生成器其实就是MVC的结构,M 指的是数据库表或其他(数据源),C指的是代码生成器引擎,V指的是代码输出。
那么代码生成器的方案有哪些可以选择?
第一:模型逻辑,控制器逻辑,视图逻辑都在WinForm的代码中混着。
很多设计者由于项目的状况(时间比较紧)或为了暂时的方便就把代码生成的逻辑直接放在代码生成器的引擎中,就像JAVA中有些人把所有的控制逻辑和展现逻辑都放在Servlet中一样。这样的程序虽然在一定程度上符合了很多开发者的需求,但是很多的项目框架和你的代码生成器生成出来的框架不一致,那就不行了,要么重新修改接口修改内部的代码,要不再转为指定的项目框架再设计一套代码生成器。优点:速度快 ; 缺点: 扩张性差.
第二:在特定项目的数据库中建几个存储过程来实现代码生成,优点:速度快 ; 缺点: 扩张性差.
第三:表示层采用服务器视图模板引擎的MVC结构,如JSP 视图引擎,ASP/ASPX/PHP等服务器视图引擎,优点:开发非常方便,可以很好的分离了视图/控制器/模型,缺点:依赖于特定的Web服务器,使用起来没有CS结构的方便好用
第四:自行开发一个视图模板引擎,然后基于该模板引擎建造一个MVC的代码生成器,如商业上的CodeSmith.优点:功能强,灵活,扩展性好;缺点:收费的。。。。
第五:基于开源模板引擎 Velocity,StringTemplate /NVelocity,StringTemplate.Net 建造一个MVC的代码生成器。
第六:基于动态语言 IronPython,Boo ,ruby等
第七:视图引擎采用Velocity,StringTemplate 等开源引擎,控制器引擎采用JAVA/.NET, Shell 接口采用动态语言,利用动态语言把模板引擎和控制器引擎有机的结合起来。
关于代码生成器的7种模式是我在日常工作中的总结,欢迎大家再多提提其它的设计方案。
最后备上一个基于第五种方案的DEMO--NDO.Tools,该生成器根据数据库表自动生成模型类,以及填补了CoR代码生成器缺少的一部分----根据表自动生成模型,控制器,以及对应的视图。
关于CoR的介绍请看,我前几天写的顶着Rails的浪潮,用NDO + Castle的monorail 也来秀一把