CodeSmith模板代码生成实战详解
前言
公司项目是基于soa面向服务的架构思想开发的,项目分解众多子项目是必然的。然而子项目的架子结构种类也过多的话,就会对后期的开发维护产生一锅粥的感觉。为了尽可能的在结构层避免出现这种混乱的现象,我们就做了一个决定,使用一个统一的架子结构,让项目管理变的简单起来。
这样一来,结构中各层就会有很多重复的代码或者重复的逻辑出现,为啦提高开发效率,节约开发时间,我们采用了codesmith根据自定义模板,生成代码功能。让单表的增删改查功能从数据访问层到ui展示层一键批量生成。下面就开始我的codeSmith模板编写历程回顾。
CodeSmith安装下载
官网地址:http://www.codesmithtools.com
下载地址:http://www.codesmithtools.com/downloads
我使用的,带破解注册工具的codesmith链接:http://pan.baidu.com/s/1dDdndsd。
傻瓜式安装,不做介绍。只不过你安装完需要很多码。那么烦啦,就用我百度云里面的。带注册软件,安装完之后,不要急于打开codesmith,先去用注册软件注册下。
安装完成,破解成功。
打开codesmith主界面如下。
Note:打开新建Csharp template,然后后缀名为cst的就是模板文件,自己写的模板代码,就在这种后缀格式的文件中。然后光标放在模板文件中,F5即可生成你要代码的文件。
写自己的codesmith模板代码。
1、自定义参数模板
Note:从这里我们能看到参数的声明,与基本语法的使用规则,需带<%%>。熟悉之后,在右下角给参数赋值,然后光标放入模板中,点击f5生成代码,看下,推敲下。
2、遍历数据库中表的模板
Note:图片展示的是怎么设置数据库配置
模板代码如下
<%--引入c#模板--%>
<%@ CodeTemplate Language="C#" TargetLanguage="C#" Debug="False" Description="Create an enum of tables." %>
<%--声明数据库的参数,在左下角的Database属性中,选择要操作的数据库名称--%>
<%@ Property Category="Database" Name="SourceDatabase" Type="SchemaExplorer.DatabaseSchema" Optional="False" Description="Database the table enums will come from." %>
<%--引入下面的类库,操作数据库必备的。不要纠结加入就行啦。--%>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>
<%--SourceDatabase, 是你选择数据库的属性类,涵盖数据库的名称,创建时间,字符串链接,描述等等,自己可以点点看 --%>
public enum <%=SourceDatabase.Name %>Tables
{
<%-- 遍历数据库中的表集合 --%>
<% for(int x = ; x < SourceDatabase.Tables.Count; x++)
{
TableSchema table = SourceDatabase.Tables[x];
if (x < SourceDatabase.Tables.Count -)
//输出表名,这里是c#的注释,不会被写进生成的代码中。\t为换行符。
Response.WriteLine("\t{0},", table.Name);
else
Response.WriteLine("\t{0}", table.Name);
}
%>
}
3、遍历数据库表中的字段,声明并使用自定义函数
<%@ CodeTemplate Language="C#" TargetLanguage="C#" Debug="False" Description="Create a list of properties from database table." %>
<%--声明数据库表的参数,在左下角的表属性中,选择要操作的数据库表--%>
<%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="Context" Description="Table that the object is based on." %>
<%--引入system类型转为c#的数据类型的映射字典 --%>
<%@ Map Name="CSharpAlias" Src="System-CSharpAlias" Description="System to C# Type Map" %>
<%--引入下面的类库,操作数据库必备的。--%>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>
<%--遍历数据库表的字段属性--%>
<% foreach (ColumnSchema column in this.SourceTable.Columns) { %>
<%--拼接字符串,输出c#中实体的属性--%>
public <%= ControlType(CSharpAlias[column.SystemType.FullName]) %> <%= StringUtil.ToPascalCase(column.Name) %>{ get; set; } <% } %>
<script runat="template">
//如果类型为int,或datetime类型输出可空类型
public string ControlType(object val)
{
var ty=val.ToString();
if(ty=="int")
{
return "int?";
}
if(ty=="System.DateTime")
{
return "System.DateTime?";
}
return ty;
}
</script>
4、批量生成文件,并指定生成文件位置
代码如下
<%@ Template Language="C#" TargetLanguage="Text" %>
<%-- 注册要生成的模板 --%>
<%@ Register Name="TableEnumTemplate" Template="TableEnum.cst" MergeProperties="Flase" ExcludeProperties=""%>
<%@ Register Name="TableClumTemplate" Template="TableProperties.cst" MergeProperties="Flase" ExcludeProperties=""%> <%--声明数据库的参数,在左下角的Database属性中,选择要操作的数据库名称--%>
<%@ Property Category="Database" Name="SourceDatabase" Type="SchemaExplorer.DatabaseSchema" Optional="False" Description="Database the table enums will come from." %>
<%--Type数据类型为TableSchema,表明参数Table是一个表对象。--%>
<%@ Property Name="SourceTable" Type="TableSchema" DeepLoad="True" Optional="False" Category="Table" Description="Table Name"%>
<%-- 执行输出文件的函数 --%>
<% this.OutPutFile(); %>
<script runat="template">
//输出文件
private void OutPutFile()
{
//生成列举表名的模板
CodeTemplate table =new TableEnumTemplate();
//指定输出路径
string tableFilePath = OutputDirectory +"\\"+ this.SourceDatabase.Name +".cs";
//给子模板参数赋值
table.SetProperty("SourceDatabase",this.SourceDatabase);
table.RenderToFile(tableFilePath,true); //生成列表表字段的模板
CodeTemplate cloumn =new TableClumTemplate();
//指定输出路径
string cloumnFilePath = OutputDirectory +"\\"+ this.SourceTable.Name +".cs";
//给子模板参数赋值
cloumn.SetProperty("SourceTable",this.SourceTable);
cloumn.RenderToFile(cloumnFilePath,true);
}
//解决方案输出路径
private string Directory = String.Empty;
[Editor(typeof(System.Windows.Forms.Design.FolderNameEditor), typeof(System.Drawing.Design.UITypeEditor))]
[Optional, NotChecked]
[DefaultValue("")]
public string OutputDirectory
{
get
{
return Directory;
}
set
{
if (value.EndsWith("\\")) value = value.Substring(, value.Length -);
Directory = value;
}
}
</script>
数据库表生成md文档模板
<%--目标语言C#--%>
<%@ CodeTemplate Inherits="CodeTemplate" Language="C#" TargetLanguage="Text" Description="" Debug="True" ResponseEncoding="UTF-8"%> <%--Type数据类型为TableSchema,表明参数Table是一个表对象。--%>
<%@ Property Name="Table" Type="TableSchema" DeepLoad="True" Optional="False" Category="Table" Description="Table Name"%> <%--引入数据库操作组件--%>
<%@ Assembly Name="SchemaExplorer"%>
<%@ Import Namespace="SchemaExplorer"%>
### <%=Table.FullName %>表描述 |字段名|数据类型|是否可空|数据库类型|长度|描述|
|--|--|--|--|--|--|
<%for(int i=0;i<Table.Columns.Count;i++){%>
|<%=Table.Columns[i].Name.ToString()%>|<%=Table.Columns[i].SystemType.ToString()%>|<%=Table.Columns[i].AllowDBNull?"Yes":"No" %> |<%=Table.Columns[i].NativeType.ToString() %>|<%=Table.Columns[i].Size %>|<%=Table.Columns[i].Description.ToString()%>|
<%}%>
好啦,就这么多啦,能满足我的需求啦。
小结
如果你在看到本文后有什么疑问,请加入博客左上角群,一起交流学习。
CodeSmith模板代码生成实战详解的更多相关文章
- 《iOS 7 应用开发实战详解》
<iOS 7 应用开发实战详解> 基本信息 作者: 朱元波 管蕾 出版社:人民邮电出版社 ISBN:9787115343697 上架时间:2014-4-25 出版日期:2014 年5 ...
- 《Android NFC 开发实战详解 》简介+源码+样章+勘误ING
<Android NFC 开发实战详解>简介+源码+样章+勘误ING SkySeraph Mar. 14th 2014 Email:skyseraph00@163.com 更多精彩请直接 ...
- 011-Scala中的apply实战详解
011-Scala中的apply实战详解 object中的apply方法 class中的apply方法 使用方法 apply方法可以应用在类或者Object对象中 class类 必须要创建实例化的类对 ...
- 010-Scala单例对象、伴生对象实战详解
010-Scala单例对象.伴生对象实战详解 Scala单例对象详解 函数的最后一行是返回值 子项目 Scala伴生对象代码实战 object对象的私有成员可以直接被class伴生类访问,但是不可以被 ...
- 008-Scala主构造器、私有构造器、构造器重载实战详解
008-Scala主构造器.私有构造器.构造器重载实战详解 Scala主构造器实战 无参数的主构造器 分析 1.name 需要赋初值,一般通过占位符来代表空值 2.private 声明私有的age 生 ...
- 009-Scala的内部类实战详解
009-Scala的内部类实战详解 Scala内部类详解 与java的区别 java的内部类是从属于外部类的 Scala的内部类是从属于对象的 内部类在调用方法的时候传递的内部类只能是由自己本身 欢迎 ...
- 007-Scala类的属性和对象私有字段实战详解
007-Scala类的属性和对象私有字段实战详解 Scala类的使用实战 变量里的类必须赋初值 def函数时如果没参数可不带括号 2.不需要加Public声明 getter与setter实战 gett ...
- 005-Scala数组操作实战详解
005-Scala数组操作实战详解 Worksheet的使用 交互式命令执行平台 记得每次要保存才会出相应的结果 数组的基本操作 数组的下标是从0开始和Tuple不同 缓冲数组ArrayBuffer( ...
- 《Node.js开发实战详解》学习笔记
<Node.js开发实战详解>学习笔记 ——持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...
随机推荐
- 从RPC开始(一)
这是一篇关于纯C++RPC框架的文章.所以,我们先看看,我们有什么? 1.一个什么都能干的C++.(前提是,你什么都干了) 2.原始的Socket接口,还是C API.还得自己去二次封装... 3.C ...
- .NET跨平台之旅:将示例站点升级至 ASP.NET Core 1.1
微软今天在 Connect(); // 2016 上发布了 .NET Core 1.1 ,ASP.NET Core 1.1 以及 Entity Framework Core 1.1.紧跟这次发布,我们 ...
- 【趣事】用 JavaScript 对抗 DDOS 攻击 (下)
上一篇:http://www.cnblogs.com/index-html/p/js-network-firewall.html 对抗 v2 之前的那些奇技淫巧,纯属娱乐而已,并不能撑多久. 但简单. ...
- AutoMapper:Unmapped members were found. Review the types and members below. Add a custom mapping expression, ignore, add a custom resolver, or modify the source/destination type
异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html 应用场景:ViewModel==>Mode映射的时候出错 AutoMappe ...
- console的高级使用
1.console.table()用来表格化展示数据. var people = { zqz: { name: 'zhaoqize', age: 'guess?' }, wdx: { name: 'w ...
- [.NET] 打造一个很简单的文档转换器 - 使用组件 Spire.Office
打造一个很简单的文档转换器 - 使用组件 Spire.Office [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6024827.html 序 之前,& ...
- 趣说游戏AI开发:曼哈顿街角的A*算法
0x00 前言 请叫我标题党!请叫我标题党!请叫我标题党!因为下面的文字既不发生在美国曼哈顿,也不是一个讲述美国梦的故事.相反,这可能只是一篇没有那么枯燥的关于算法的文章.A星算法,这个在游戏寻路开发 ...
- [数据结构]——堆(Heap)、堆排序和TopK
堆(heap),是一种特殊的数据结构.之所以特殊,因为堆的形象化是一个棵完全二叉树,并且满足任意节点始终不大于(或者不小于)左右子节点(有别于二叉搜索树Binary Search Tree).其中,前 ...
- Java类访问权限修饰符
一.概要 通过了解Java4种修饰符访问权限,能够进一步完善程序类,合理规划权限的范围,这样才能减少漏洞.提高安全性.具备表达力便于使用. 二.权限表 修饰符 同一个类 同一个包 不同包的子类 不同包 ...
- RabbitMQ + PHP (二)AMQP拓展安装
上篇说到了 RabbitMQ 的安装. 这次要在讲案例之前,需要安装PHP的AMQP扩展.不然可能会报以下两个错误. 1.Fatal error: Class 'AMQPConnection' not ...