惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Application and Cybersecurity Blog
Application and Cybersecurity Blog
N
News | PayPal Newsroom
The Last Watchdog
The Last Watchdog
S
Secure Thoughts
Forbes - Security
Forbes - Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
PCI Perspectives
PCI Perspectives
N
News and Events Feed by Topic
Hacker News - Newest:
Hacker News - Newest: "LLM"
Last Week in AI
Last Week in AI
Blog — PlanetScale
Blog — PlanetScale
Hacker News: Ask HN
Hacker News: Ask HN
H
Heimdal Security Blog
D
Docker
Cloudbric
Cloudbric
P
Privacy International News Feed
S
Security Affairs
TaoSecurity Blog
TaoSecurity Blog
博客园 - 聂微东
WordPress大学
WordPress大学
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
T
Tenable Blog
Scott Helme
Scott Helme
人人都是产品经理
人人都是产品经理
Recent Announcements
Recent Announcements
P
Palo Alto Networks Blog
小众软件
小众软件
L
LINUX DO - 最新话题
美团技术团队
Google Online Security Blog
Google Online Security Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
雷峰网
雷峰网
Microsoft Security Blog
Microsoft Security Blog
The Hacker News
The Hacker News
Webroot Blog
Webroot Blog
T
Tor Project blog
G
Google Developers Blog
A
About on SuperTechFans
Y
Y Combinator Blog
K
Kaspersky official blog
A
Arctic Wolf
量子位
I
InfoQ
V
Visual Studio Blog
T
Troy Hunt's Blog
C
Cybersecurity and Infrastructure Security Agency CISA
J
Java Code Geeks
博客园 - 【当耐特】
GbyAI
GbyAI

博客园 - 云飞扬

揭开文档在线编辑和预览的神秘面纱 AI的正确使用方法 详解HFBPM开发框架(下) 详解HFBPM开发框架(中) 详解HFBPM开发框架(上) 浅谈数据访问层 流程梳理的重要性 菜鸟电子面单对接技术方案(link) 数据库升级工具 HF工作流引擎与现有业务系统的整合 一步一步学习开发BPM工作流系统--------(七)BPM表单设计和业务展现平台 一步一步学习开发BPM工作流系统--------(六)BPM流程设计器(2) 一步一步学习开发BPM工作流系统--------(六)BPM流程设计器(1) 一步一步学习开发BPM工作流系统--------(五)用户、组织机构和权限管理 一步一步学习开发BPM工作流系统--------(四)BPM数据库访问层 一步一步学习开发BPM工作流系统--------(三)开发WinForm的应用平台-2 - 云飞扬 一步一步学习开发BPM工作流系统--------(三)开发WinForm的应用平台-1 一步一步学习开发BPM工作流系统--------(二)BPM工作流系统的组成部分 - 云飞扬 一步一步学习开发BPM工作流系统--------(一)为什么要开发工作流系统 支持多数据库本地和远程调用的数据访问层架构
HF Code Designer 代码生成器
云飞扬 · 2013-10-19 · via 博客园 - 云飞扬

最近忙于项目和平台开发好久没写博客了,今天把最近的一个项目总结和大家分项一下。

在平台开发的过程中,代码生成器是必不可少的,Net领域的代码生成器比较多,以前用动软的,最早的那个版本还是开源,自己写了一个插件,总算能按照我的要求输出代码了。但是平台的代码结构不断调整,生成代码的格式不断变化,要不断的修改插件,然后重新编译再发布。比较麻烦,就想换一款代码生成器,看了一下CodeSmith,这不错,是基于模板的,比较灵活,研究了半天模板看着比较繁琐,(本人对新事物的接受能力明显不如从前,大概是老了),其实原理很简单,关键是模板技术,做web前端的人对这个技术并不会陌生,前段时间做表单设计器用过整个技术,所以何不自己开发一个代码生成器?基于前面的积累,做一个这样的代码生成器也就2天的时间。

有这个想法不是一两天了,考虑成熟后就动手了,在原来的应用框架上,经过2天的时间初版基本完成,测试后拿到新项目中使用了。下面是代码生成器的截图。跟动软的界面比较像,但是实现原理完全不一样。

clip_image002

下面分享一下实现过程。

代码生成器需要解决一下几个问题:

1、 读取数据库结构,包括数据库、表、视图和字段。

2、 制定代码模板,按照自己业务代码的要求编写代码模板。可以编写多个模板,例如使用Datatable和Entity的可以定义不同的模板,代码生成的时候选择不同的模板即可。

3、 代码的预览,根据模板生成代码后需要预览一下,为了直观的显示代码,希望有visual studio ide那样的代码编辑器,但是不知道怎么集成这个编辑器,有知道的朋友可以告诉我。没办法,从SharpDevelop开源项目上扒了编辑器,各种无奈,该项目新版的编辑器是wpf,所以目前只能用它低版本的编辑器,不过基本够用了。上图的效果可以看到,比较直观。

4、 代码生成类文件,可以把上面生成的代码复制到类库文件中。也可以批量生成类库文件。

下面具体介绍每一步实现过程。

1、 读取数据库结构

获取数据库结构包括:获取数据库名,表视图名,字段属性。获取数据库的方法很多,一般是读取系统表, 返回数据库的sql如下SELECT Name FROM Master..SysDatabases ORDER BY Name, 能返回当前数据库实例的所有数据库,这样不好,把一些不需要的数据库也读取出来了,我采用的方式读取配置文件。只要在配置文件中定义的数据库连接字符串都读出来。配置文件中的数据库连接字符串如下图:

clip_image004

表示配置了3个数据库连接,把这三个连接作为可访问的数据库。从配置文件读取数据库连接字符串,使用ConfigurationManager类的方法,代码如下图:

clip_image006

读取的数据库加载到树节点上。加载后的效果如下图:

clip_image008

选中数据库后,加载数据库中的表和视图,也是利用系统表sysobjects,读取数据库中所有表的sql语句:SELECT * FROM sysobjects where xtype='U' order by name , 读取数据库中所有试图的sql语句:SELECT * FROM sysobjects where xtype='V' order by name,读取之前要制定连接的数据库。

读取了数据库和表以后,读取表中的字段,这个比较麻烦,需要了解字段在系统表中的存放,读取字段的方法如下图:

clip_image010

作了一个关联查询,查询处的结果如下图:

clip_image012

信息每个字段的意思一看就明白了。

2 制定代码模板

做过cms的都知道什么是模板技术,就是在文件里定义标签,运行的时候用内容替换标签,这个过程很简单,但是要做到强大的替换功能,需要引入模板引擎的概念,说句题外话,asp.net的页面处理机制全部采用这种技术。我使用的模板引擎是第三方的轻量级的著名的模板引擎NVelocity。下面是我定义的代码模板:

clip_image014

它是一个txt文件,里面除了模板引擎的关键字和引擎符号,其余的文字可以随便写。生成的代码如下:

clip_image016

使用模板引擎需要注意的是,模板中的$变量必须是数据实体的形式提供,不能是其他类型,也就是可序列化的类型才行,否则模板引擎不认识。

3 代码预览,这个前面已经讲过了,使用的是一个开源的控件。模板生成和代码预览的核心代码如下图:

clip_image018

模板技术就是这么强大,掌握了整个技术,可以做出基于模板的web页面,不要担心模板的生成速度,模板引擎是相当快的,几乎感觉不到有什么延迟。基于浏览器的页面呈现和报表控件都是基于这种技术。

4 生成类文件

这个过程再简单不过了,代码都已经生成了,复制到类文件中即可,可以把整个项目的类文件批量生成出来。不过这要求前面的设计必须很成熟了。否则一旦生成的代码要修改,就要重新生成了。

总算结束了,这只是初版后面会继续完善。最近项目工期紧,有时间的时候再来分享一款查询引擎。