最近忙于项目和平台开发好久没写博客了,今天把最近的一个项目总结和大家分项一下。
在平台开发的过程中,代码生成器是必不可少的,Net领域的代码生成器比较多,以前用动软的,最早的那个版本还是开源,自己写了一个插件,总算能按照我的要求输出代码了。但是平台的代码结构不断调整,生成代码的格式不断变化,要不断的修改插件,然后重新编译再发布。比较麻烦,就想换一款代码生成器,看了一下CodeSmith,这不错,是基于模板的,比较灵活,研究了半天模板看着比较繁琐,(本人对新事物的接受能力明显不如从前,大概是老了),其实原理很简单,关键是模板技术,做web前端的人对这个技术并不会陌生,前段时间做表单设计器用过整个技术,所以何不自己开发一个代码生成器?基于前面的积累,做一个这样的代码生成器也就2天的时间。
有这个想法不是一两天了,考虑成熟后就动手了,在原来的应用框架上,经过2天的时间初版基本完成,测试后拿到新项目中使用了。下面是代码生成器的截图。跟动软的界面比较像,但是实现原理完全不一样。
下面分享一下实现过程。
代码生成器需要解决一下几个问题:
1、 读取数据库结构,包括数据库、表、视图和字段。
2、 制定代码模板,按照自己业务代码的要求编写代码模板。可以编写多个模板,例如使用Datatable和Entity的可以定义不同的模板,代码生成的时候选择不同的模板即可。
3、 代码的预览,根据模板生成代码后需要预览一下,为了直观的显示代码,希望有visual studio ide那样的代码编辑器,但是不知道怎么集成这个编辑器,有知道的朋友可以告诉我。没办法,从SharpDevelop开源项目上扒了编辑器,各种无奈,该项目新版的编辑器是wpf,所以目前只能用它低版本的编辑器,不过基本够用了。上图的效果可以看到,比较直观。
4、 代码生成类文件,可以把上面生成的代码复制到类库文件中。也可以批量生成类库文件。
下面具体介绍每一步实现过程。
1、 读取数据库结构
获取数据库结构包括:获取数据库名,表视图名,字段属性。获取数据库的方法很多,一般是读取系统表, 返回数据库的sql如下SELECT Name FROM Master..SysDatabases ORDER BY Name, 能返回当前数据库实例的所有数据库,这样不好,把一些不需要的数据库也读取出来了,我采用的方式读取配置文件。只要在配置文件中定义的数据库连接字符串都读出来。配置文件中的数据库连接字符串如下图:
表示配置了3个数据库连接,把这三个连接作为可访问的数据库。从配置文件读取数据库连接字符串,使用ConfigurationManager类的方法,代码如下图:
读取的数据库加载到树节点上。加载后的效果如下图:
选中数据库后,加载数据库中的表和视图,也是利用系统表sysobjects,读取数据库中所有表的sql语句:SELECT * FROM sysobjects where xtype='U' order by name , 读取数据库中所有试图的sql语句:SELECT * FROM sysobjects where xtype='V' order by name,读取之前要制定连接的数据库。
读取了数据库和表以后,读取表中的字段,这个比较麻烦,需要了解字段在系统表中的存放,读取字段的方法如下图:
作了一个关联查询,查询处的结果如下图:
信息每个字段的意思一看就明白了。
2 制定代码模板
做过cms的都知道什么是模板技术,就是在文件里定义标签,运行的时候用内容替换标签,这个过程很简单,但是要做到强大的替换功能,需要引入模板引擎的概念,说句题外话,asp.net的页面处理机制全部采用这种技术。我使用的模板引擎是第三方的轻量级的著名的模板引擎NVelocity。下面是我定义的代码模板:
它是一个txt文件,里面除了模板引擎的关键字和引擎符号,其余的文字可以随便写。生成的代码如下:
使用模板引擎需要注意的是,模板中的$变量必须是数据实体的形式提供,不能是其他类型,也就是可序列化的类型才行,否则模板引擎不认识。
3 代码预览,这个前面已经讲过了,使用的是一个开源的控件。模板生成和代码预览的核心代码如下图:
模板技术就是这么强大,掌握了整个技术,可以做出基于模板的web页面,不要担心模板的生成速度,模板引擎是相当快的,几乎感觉不到有什么延迟。基于浏览器的页面呈现和报表控件都是基于这种技术。
4 生成类文件
这个过程再简单不过了,代码都已经生成了,复制到类文件中即可,可以把整个项目的类文件批量生成出来。不过这要求前面的设计必须很成熟了。否则一旦生成的代码要修改,就要重新生成了。
总算结束了,这只是初版后面会继续完善。最近项目工期紧,有时间的时候再来分享一款查询引擎。