CodeSmith 介绍
代码生成器作用
中国有句古语叫做“工欲善其事,必先利其器”,用通俗的话来说就是“磨刀不误砍柴功”,古人的这些话告诉我们:要把事情做好,事先应该准备合适的工具。工具不仅仅包括器具,
还包括思想、理论、经验、道德、法律等一切能解决问题的有形和无形的东西。
CodeSmith介绍
CodeSmith是一个代码生成器,可以用来大量生成代码的。用起来其实也很简单,可是许多人都不能入门。大部分的代码生成工具都是需要模板的,这个很好理解,模板就是一段代码,
里面留几个洞,这个洞会被数据库的字段名或表名等填充,CodeSmith的最多的用法就是连接数据库,然后把数据库信息取出来去替换用户提供的模板中关键字,这就是代码生成的原理。
为了生成更灵活,模板和关键字可以混合在一起写,这个蛮怪异的,不过你看懂了也就无所谓了。
当生成应用程序时,无论是编写数据访问代码还是生成自定义集合,你会发现经常需要重复完成某些特定的任务。这时 CodeSmith 就显得特别有用,因为你可以编写模板自动完成
这些任务,从而不仅提高你的工作效率,而且能够自动完成那些最为乏味的任务。
CodeSmith界面
CodeSmith 的代码编写界面跟常见的开发IDE很类似。常用的就是Bulid Templete, Generate,以及Output VIEW。
CodeSmith 语法介绍
.注释 <%-- 这是一个C#语言的模板 --%> .加载使用访问数据库的组件SchemaExplorer,并声明其使用的命名空间 <%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %> .声明表对象 <%@ Property Name="TargetTable" Type="SchemaExplorer.TableSchema" Category="Context" Description="TargetTable that the object is based on." %> .声明视图对象 <%@ Property Name="TargetView" Type="SchemaExplorer.ViewSchema" Category="Context" Description="TargetView that the object is based on." %> .设置输入信息框
<%@ Property Name="Author" Type="String" Category="Context" Description="作者" %> .编写C# 语言块 5.1 <% %>
5.2 <script runat="template">
private string GetDesc(string name)
{
string temp=string.Empty;
temp+="//作者:"+name+" Create Date:"+System.DateTime.Now.ToString();
return temp;
}
</script>
5.3 创建.cs文件,声明中src 引用
<%@ CodeTemplate Language="C#" TargetLanguage="C#" Src="Common.cs" Description="指明是一个C#语言版本" Inherits="Common" %> .赋值<%= %> .相关的数据库对象
7.1 表名:TargetTable.Name
7.2 表列结合:TargetTable.Columns
7.3 列描述:column.Description
CodeSmith 生成实体类模板
有了上述的语法知识,我们开始编写一个简单的实体对象(Model),最终结果是
//============================================================
///Create By:QingQing
//============================================================ using System;
using System.Collections.Generic;
using System.Text; namespace POP.Domain
{
[Serializable()]
public class Area
{
/// <summary>
///
/// </summary>
public long Areaid {get;set;}
/// <summary>
///
/// </summary>
public string Areaname {get;set;}
/// <summary>
///
/// </summary>
public string Aliasname {get;set;}
/// <summary>
///
/// </summary>
public long? Parentid {get;set;}
/// <summary>
///
/// </summary>
public long? Sortno {get;set;}
/// <summary>
/// T:有效,F:无效
/// </summary>
public string Valid {get;set;}
}
}
思考一下,using 引用的命名空间是固定的,get set熟悉是固定的,剩下的就是要从数据库里获取表对象进行填充了,上模板。
<%-- 这是一个C#语言的模板 --%>
<%@ CodeTemplate Language="C#" TargetLanguage="C#" Src="Common.cs" Description="指明是一个C#语言版本" Inherits="Common" %>
<%-- 加载使用访问数据库的组件SchemaExplorer,并声明其使用的命名空间 --%>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>
<%-- 通过这个数据表类型的变量得到相应的表的信息:TableSchema(表) ViewSchema(视图) --%>
<%@ Property Name="TargetTable" Type="SchemaExplorer.TableSchema" Category="Context" Description="TargetTable that the object is based on." %>
<%@ Property Name="Author" Type="String" Category="Context" Description="作者" %>
<%--代码需要的输入值变量--%>
<%@ Property Name="NameSpace" Default="MyTest.DoMain" Type="String" Category="Context" Description="生成代码是需要输入的变量" %> <%--<%=GetDesc(Author)%>--%>
<% PrintHeader(Author); %>
using System;
using System.Collections.Generic;
using System.Text; namespace <%=NameSpace %>
{
[Serializable()]
public class <%=GetNewTableName(TargetTable.Name)%>
{
<%
foreach (ColumnSchema column in TargetTable.Columns)
{
%>
/// <summary>
/// <%=column.Description %>
/// </summary>
public <%=GetCSharpTypeFromDBFieldType(column) %> <%=GetNewColoumName(column.Name)%> {get;set;}
<%
}
%>
}
} <script runat="template">
/// <summary>
///// 设置文件描述
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
private string GetDesc(string name)
{
string temp=string.Empty;
temp+="//作者:"+name+" Create Date:" +System.DateTime.Now.ToString();
return temp;
} /// <summary>
/// 设置文件名称,后缀名
/// </summary>
/// <returns></returns>
public override string GetFileName()
{
return this.TargetTable + ".cs";
}
</script>
编译模板
模板编写完成,要进行编译,确认语法是否通过。输出日志框,错误列表都是我们的好帮手。
使用模板生成文件
OK,模板编译通过我们就要见证奇迹的时刻了。
批量生成文件
单个文件能够生成了,是不是很方便呢,但是聪明的你肯定发现,怎没有提供批量生成的按钮呢?对的,这就需要我们继续编写模板来进行实现了。
批量生成要注意一下几点:
- 注册生成单个模板的文件
- 添加单个文件需要使用的文本框
- 注册获取数据库的对象
- 编写方法遍历数据库的表对象
- 编写获取输出文件的路径
以下就是模板,同样的右键点击模板,Execute,填写相关参数,选择数据库,Generate,生成的文件就会出现在选择的文件夹中
<%@ CodeTemplate Inherits="CodeTemplate" Language="C#" TargetLanguage="Text" Description="生成整个表" Debug="True" ResponseEncoding="UTF-8"%> <%-- 注册实体层Entity模板 --%>
<%@ Register Name="EntityTemplate" Template="BaseForModel.cst" MergeProperties="Flase" ExcludeProperties=""%>
<%@ Property Name="Author" Type="String" Category="02.作者" Description="作者" %>
<%-- 获取整个数据库对象 --%>
<%@ Property Name="SourceDatabase" Type="SchemaExplorer.DatabaseSchema" DeepLoad="True" Optional="False" Category="01. 获取数据库对象" Description="获取整个数据库对象"%> <%
//创建实体层Entity类
this.GenerateEntityClasses();
//Debug模式下的信息[Debug="True"]
Debug.WriteLine("Success");
%> <script runat="template">
//生成实体Entity类
private void GenerateEntityClasses()
{
//获取模板对象
CodeTemplate Template =new EntityTemplate();
foreach(TableSchema table in this.SourceDatabase.Tables)
{
string FileDirectory = OutputDirectory +"\\"+ GetNewTableName(table.Name) +".cs";
//设置模板的相关内容(Table名称 ,作者名称)
Template.SetProperty("TargetTable",table);
Template.SetProperty("Author",Author);
//文件输出
Template.RenderToFile(FileDirectory,true);
Debug.WriteLine(FileDirectory +" 创建成功.");
}
} /// <summary>
/// 获取新的TableName(首字母大写,去掉下划线)
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public string GetNewTableName(string name)
{
string table=name.Substring().ToLower();
string tempTableName=string.Empty;
if(table.IndexOf('_')>)
{
string[] temp=table.Split('_');
for (int i = ; i < temp.Length; i++)
{
tempTableName+=System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(temp[i]); //设置首字母大写
}
}
else
{
tempTableName=System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(table); //设置首字母大写
}
return tempTableName;
} //解决方案输出路径
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>
总结
CodeSmith 最大的优势就是编写模板生成符合条件的代码。其IDE自身提供了很多相关的模板,里面有很多好用的语法糖。附件提供自己编写的几个模板,供大家学习参考。
小伙伴们快快动手编写属于自己的模板吧,从繁琐的任务重脱离出来,我们的编程更加的愉快。
CodeSmith 介绍的更多相关文章
- CodeSmith介绍和常见问题解决方案
一.CodeSmith介绍 CodeSmith模板代码生成实战详解 https://www.cnblogs.com/knowledgesea/p/5016077.html 二.CodeSmith连接 ...
- 常用工具&网址
工具 I tell you http://www.win7999.com/news/197912345.html VisualSVN Server(免费) http://www.visualsvn.c ...
- CodeSmith中SchemaExplorer属性的介绍
CodeSmith与数据库的联系,在CodeSmith中自带一个程序集SchemaExplorer.dll,这个程序集中的类主要用于获取数据库中各种对象的结构. <%@ Property Nam ...
- CodeSmith模板代码生成实战详解
前言 公司项目是基于soa面向服务的架构思想开发的,项目分解众多子项目是必然的.然而子项目的架子结构种类也过多的话,就会对后期的开发维护产生一锅粥的感觉.为了尽可能的在结构层避免出现这种混乱的现象,我 ...
- 应用程序框架实战三十六:CRUD实战演练介绍
从本篇开始,本系列将进入实战演练阶段. 前面主要介绍了一些应用程序框架的概念和基类,本来想把所有概念介绍完,再把框架内部实现都讲完了,再进入实战,这样可以让初学者基础牢靠.不过我的精力很有限,文章进度 ...
- 应用程序框架实战二十九:Util Demo介绍
上文介绍了我选择EasyUi作为前端框架的原因,并发放了最新Demo.本文将对这个Demo进行一些介绍,以方便你能够顺利运行起来. 这个Demo运行起来以后,是EasyUi的一个简单CRUD操作,数据 ...
- 软件代码生成之Codesmith模板.netTiers
.netTiers模板到2006年就诞生了, 到今天最后一次更新是12/17/2013, 支持.NET 4.5 and Visual Studio 2012 and 2013. n ...
- [转]CodeSmith和PowerDesigner的使用安装和数据库创建
最近要忙期考,但还是决定每天抽点空来写CodeSmith的系列文章了,在此实在不敢用教程这个词语,毕竟自己对CodeSmith了解的也不是很多,有很多牛人都在博客园发布了不少关于CodeSmith的文 ...
- 是时候改变你的开发方式了-XAF信息系统快速框架介绍
我是一名.Net开发者,从DOS时代Turbo c 算起(1996年),马上满20年了.想想写过的代码真是不少,却做了很多重复反复的编码工作.当然中间也带过团队做过几个大项目,但是代码仍没写够,还是每 ...
随机推荐
- 【转】logback logback.xml常用配置详解(一)<configuration> and <logger>
原创文章,转载请指明出处:http://aub.iteye.com/blog/1101260, 尊重他人即尊重自己 详细整理了logback常用配置, 不是官网手册的翻译版,而是使用总结,旨在更快更透 ...
- Canvas里绘制矩阵文字
效果如下 实现方法: [ [0,0,1,1,1,0,0], [0,1,1,0,1,1,0], [1,1,0,0,0,1,1], [1,1,0,0,0,1,1], [1,1,0,0,0,1,1], [1 ...
- WPF重写Image实现动态图片--未测试
WPF很强大,但是当WPF的image控件遇到gif时就只读了图片的第一帧,很好很强大! WPF不屑于gif的简单动画! 幸好WPF里有MediaElement这个东西,它是对MediaPlyer的一 ...
- Purfer Sequence
原文地址:http://www.cnblogs.com/zhj5chengfeng/archive/2013/08/23/3278557.html 我们知道,一棵树可以用括号序列来表示,但是,一棵顶点 ...
- 史上最全的java随机数生成算法分享(转)
这篇文章主要介绍了史上最全的java随机数生成算法,我分享一个最全的随机数的生成算法,最代码的找回密码的随机数就是用的这个方法 String password = RandomUtil.generat ...
- manifest中读取<meta-data>
meta-data在清单文件中主要有以下用法: <application> <meta-data android:value="a1" android ...
- 简单的Markdown功能实现——marked模块的使用
marked是一个markdown 解析.编译器,通过引入marked模块,可以实现一个简单的markdown编辑器.使用方式如下: Install 新建一个项目文件夹,在项目中下载marked模块 ...
- MVC 关于easyui-datebox 赋值问题
view <script type="text/javascript"> $(function () { var date = '@ViewData["end ...
- ssh 使用密钥与登录进行远程cp
scp -P 50000 -i abc.pem ubuntu@10.223.191.105://srv/log/webserver/main/nginx.access.2015-08-07.log ...
- grep 命令详解
[root@www ~]# grep [-acinv] [--color=auto] '搜寻字符串' filename 选项与参数: -a :将 binary 文件以 text 文件的方式搜寻数据 - ...