利用CodeSmith为SQL Server CE生成项目代码
摘要:CodeSmith是很多.NET开发人员至爱的开发辅助工具,它能够使开发人员从大量枯燥无味的重复编码中解脱,集中精力解决实际业务问题和技术问题。本文将介绍如何将CodeSmith用于Windows Mobile项目,以SQL Server Compact Edition数据库作为代码生成的依据生成项目代码。
什么是代码生成器?
代码产生器是产生式编程(Generative Programming)在实际应用中的一种产物。它以系统建模为基础,通过抽象各种系统间的共性与特性,利用代码模板和组件重用技术,自动产生满足客户需求的软件产品。从而降低成本,减少软件推向市场的时间,并且保证更好的产品质量。最终取得规模经济和范围经济的优点。2004年我还在大学读书的时候曾开发过一个基于模板引擎的代码生成器——RapidTier,当时这个作品还获得了广东省高校杯软件设计大赛的二等奖。在.NET的世界里,目前最有名的代码生成器当属CodeSmith和MyGeneration。这两款代码生成器都是基于模板引擎的,使用起来方便灵活,而且模板资源非常丰富。
CodeSmith 简介
CodeSmith 是一个基于模板的代码生成器,你可以利用它来生成任何文本语言的代码。CodeSmith 生成的代码可以通过模板的属性来定制。CodeSmith 模板的语法跟 ASP.NET 非常相似,你可以在模板中使用 C# 或 VB.NET 控制代码的生成。通常,开发人员利用CodeSmith根据SQL Server或Oracle等大型数据库生成各种项目代码(如:存储过程、数据访问层、业务逻辑层、表现层等)。今天将向各位介绍如何利用CodeSmith为移动数据库SQL Server Compact Edition生成Windows Mobile项目的代码。
配置SchemaProvider
CodeSmith通过SchemaProvider来支持各种数据库。在CodeSmith Professional 4.1.2 安装后,默认只支持SQL Server、Oracle、Access、MySQL等数据库类型。如果需要支持其他类型的数据库,可以到网上搜索相关数据库的SchemaProvider实现,或者自己手动编写代码实现ISchemaProvider接口。
最近,我从网上找到了SQL Server Compact Edition(3.1)的SchemaProvider实现,经过代码调整和调试,现在跟大家分享一下。可以从这里下载到这个SchemaProvider相关的DLL,下载后将其解压,并将SchemaExplorer.SqlCeSchemaProvider.dll和System.Data.SqlServerCe.dll文件复制到CodeSmith的SchemaProvider目录下(C:\Program Files\CodeSmith\v4.1\SchemaProviders)。
启动CodeSmith,点击左边停靠的Schema Explorer窗口上方点击“Manage Data Sources”工具栏按钮,打开Data Source Manager窗口。
Data Source Manager窗口打开后,点击Add按钮添加新的数据源。在Data Source窗口中,数据源名称(Name)输入“Northwind sqlce”,提供程序类型(Provider Type)选择SqlCeSchemaProvider,连接语句输入“data source=c:\Northwind.sdf”,假设你已经将SQL Server Compact Edition自带的Northwind.sdf数据库复制到C盘根目录了。
你可以通过点击Test按钮测试一下是否正常连接,然后点击OK保存数据源,回到Data Source Manager窗口,现在看到多了一个叫“Northwind sqlce”的数据源了。
“Northwind sqlce”数据源已经添加成功,点击Close按钮关闭Data Source Manager窗口。回到Schema Explorer窗口,展开“Northwind sqlce”数据源,浏览各个表的字段和属性。
生成代码
在CodeSmith右边停靠的Template Explorer窗口打开自带的模板“CodeSmith 4.1 Samples\ActiveSnippets\CSharp\TableProperties.cst”。这个模板可以从一个数据库的表的所有字段生成对应的实体类的所有属性(Property)定义代码。
TableProperties.cst
<%--
Name: Database Table Properties
Author: Paul Welter
Description: Create a list of properties from a database table
--%>
<%@ 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." %>
<%@ 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) { %>
private <%= CSharpAlias[column.SystemType.FullName] %> _<%= StringUtil.ToCamelCase(column.Name) %>;
public <%= CSharpAlias[column.SystemType.FullName] %> <%= StringUtil.ToPascalCase(column.Name) %>
{
get { return _<%= StringUtil.ToCamelCase(column.Name) %>; }
set { _<%= StringUtil.ToCamelCase(column.Name) %> = value; }
}
<% } %>
模板被打开后,在CodeSmith右边停靠的Properties窗口选择SourceTable属性,点击旁边的“...”按钮浏览并选择一个Northwind.sdf数据库的表。这里我们选择Categories表,并点击Select按钮确定。
现在可以按F5生成代码了,生成的结果如下所示:
生成的代码
private int _categoryID;
public int CategoryID
{
get { return _categoryID; }
set { _categoryID = value; }
}
private string _categoryName;
public string CategoryName
{
get { return _categoryName; }
set { _categoryName = value; }
}
private string _description;
public string Description
{
get { return _description; }
set { _description = value; }
}
private System.Byte[] _picture;
public System.Byte[] Picture
{
get { return _picture; }
set { _picture = value; }
}
你还可以选择其他的表或其他模板生成代码试一试,体验一下CodeSmith的强大之处。
总结
通过上面的介绍和示例演示,相信大家都认同CodeSmith确实很好很强大。当然,这里只是演示了一个很简单的例子,你可以根据项目的实际需要自己编写模板,按自己的方式去生成项目代码。编写模板最快捷的方法就是基于现有比较类似的模板进行修改。CodeSmith之所以能够用于SQL Server Compact Edition数据库的代码生成,除了前面提到的它通过SchemaProvider支持各种类型的数据库,还有一点很重要的就是SQL Server Compact Edition支持桌面平台,如果是SQL Server Mobile就没有办法做到这一点了。
相关下载:SqlCeSchemaProvider.rar
作者:黎波
博客:http://upto.cnblogs.com/
日期: 2008年 3月 29日