HF Code Designer 代码生成器
最近忙于项目和平台开发好久没写博客了,今天把最近的一个项目总结和大家分项一下。
在平台开发的过程中,代码生成器是必不可少的,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 生成类文件
这个过程再简单不过了,代码都已经生成了,复制到类文件中即可,可以把整个项目的类文件批量生成出来。不过这要求前面的设计必须很成熟了。否则一旦生成的代码要修改,就要重新生成了。
总算结束了,这只是初版后面会继续完善。最近项目工期紧,有时间的时候再来分享一款查询引擎。
HF Code Designer 代码生成器的更多相关文章
- 【转】20个Java 代码生成器
From: http://www.cnblogs.com/skyme/archive/2011/12/22/2297592.html 1.1 CodeSmith 一款人气很旺国外的基于模板的dotne ...
- 各种好用的代码生成器(C#)
各种好用的代码生成器(C#) 1:CodeSmith 一款人气很旺国外的基于模板的dotnet代码生成器 官方网站:http://www.codesmithtools.com 官方论坛:http:// ...
- 解析大型.NET ERP系统 窗体、查询、报表二次开发
详细介绍Enterprise Solution 二次开发的流程步骤,主要包括数据输入窗体(Entry Form),查询(Query/Enquiry),报表(Report)三个重要的二次开发项目. 数据 ...
- ASP.Net4.0中新增23项功能
这篇文章介绍Visual Studio 2010 (ASP.Net 4.0)的新功能. 1.代码片段(Code Snippets): 代码段是预先开发的代码模板,可以节省我们对有关语法思考的时间.在V ...
- ASP.NET自定义控件组件开发 第五章 模板控件开发
原文:ASP.NET自定义控件组件开发 第五章 模板控件开发 第五章 模板控件开发 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接 ...
- 数据库-SQLite简介
SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库(轻型数据库). 由于资源占用少.性能良好和零管理成本,嵌入式数据库有了它的用武之地,像Android.iPhone都有内置的S ...
- 20个代码生成框架 (.NET JAVA)
1.1 CodeSmith 一款人气很旺国外的基于模板的dotnet代码生成器 官方网站:http://www.codesmithtools.com 官方论坛:http://forum.codesmi ...
- C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入
C# 嵌入dll 在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形 ...
- ABP配套代码生成器(ABP Code Generator)帮助文档,实现快速开发
ABP代码生成器介绍 针对abp这个框架做了一个代码生成器,功能强大.分为两大功能点,一个是数据层,一个是视图层. 数据服务层:通过它,可以实现表设计.领域层初始化.多语言.automapper自动注 ...
随机推荐
- IIS7 503错误 Service Unavailable
把相应的Application Pools的process model的Identity属性设置成“LocalSystem”就OK了
- HDOJ_1010 Tempter of the Bone
http://acm.hdu.edu.cn/showproblem.php?pid=1010 奇偶剪枝:可以把map看成这样: 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 ...
- C# 扩展方法奇思妙用高级篇六:WinForm 控件选择器
在Web开发中,jQuery提供了功能异常强大的$选择器来帮助我们获取页面上的对象.但在WinForm中,.Net似乎没有这样一个使用起来比较方便的选择器.好在我们有扩展方法,可以很方便的打造一个. ...
- https,https的本地测试环境搭建,asp.net结合https的代码实现,http网站转换成https网站之后遇到的问题
一:什么是https SSL(Security Socket Layer)全称是加密套接字协议层,它位于HTTP协议层和TCP协议层之间,用于建立用户与服务器之间的加密通信,确保所传递信息的安 ...
- iOS多线程总结
1.不要同时开太多的线程(1~3条线程即可,不要超过5条) 2.线程概念 1> 主线程 : UI线程,显示.刷新UI界面,处理UI控件的事件 2> 子线程 : 后台线程,异步线程 3.不要 ...
- Mahout之Canopy Clustering深入理解
转自:http://www.cnblogs.com/vivounicorn/archive/2011/09/23/2186483.html Mahout学习——Canopy Clustering 聚类 ...
- How to use SourceGear DiffMerge in SourceSafe, TFS, and SVN【项目】
What is DiffMerge DiffMerge is yet-another-diff-and-merge-tool from the fine folks at SourceGear. I ...
- C# 获取字符串中的数字
/// <summary> /// 获取字符串中的数字(不包含小数点) /// </summary> /// <param name="str"> ...
- C10K problem
什么是C10K问题 1W个客户端连接上一个server,客户不定时的发送请求. I/O策略 软件架构 1.单线程解决多重I/O调用 不要使用阻塞/同步的调用,如果非要这么做,那就采用多进程或者 ...
- Delphi thread exception mechanism
http://www.techques.com/question/1-3627743/Delphi-thread-exception-mechanism i have a dilema on how ...