想法是 2004 年就有了,但是一直没有实现它。大约是08 年初 开始开发, 3月时已小有成就。
***注: 此软件不提供下载, 将会提供一些屏幕录象, 供大家一窥究竟***
现在模板引擎和 mygeneration 和 codesmith 差不多,采用asp.net类似的tag,结合c#来开发模板。
用处:
有没有发现一些design, coding, testing中的规律?我想大家肯定有不少的经验。用一个模板引擎可以:
1.把coding,design, testing中有规律的东西总结到模板中.
2.帮助提高软件开发的生产率,减轻开发人员的负担.
3.帮助提高软件开发的质量, 按照coding standard, 和自定义的架构来生成代码, 减少错误.
4.帮助开发人员总结规律.
特性:
1.目标语言可以是任何代码, 如c#, vb.net, java, jsp, javascript, php, html, xml, json,stored procedure, database script , 测试脚本等等等等。
2.目前支持sql server和MS access 2000/2003/2007的数据库结构导入, 形成如下的schema树。
3.模板编辑器支持asp.net似的tag, 和c#语法. 用c#和<% %>tag来开发模板。支持模板代码的调试, 编译出来的模板代码可以调试。
4.模板编辑器智能感知(intellisense), 语法高亮, 代码自动完成(autocomplete),就象screen shot里面的Form1类一样, 可以在自定义模板代码的界面。
5.可以用另外开发的winform, asp.net来提供自定义的模板UI界面,
6.此模板引擎可以是很复杂的.
目标图(未实现, 将要实现的功能), 欢迎大家给予建议:
1. query designer(可能对老手没有用)
2. 开发基于一些比较好的架构(如ms enterprise library, nhibernate, ORM)的模板库
3. 开发一些具有专业外观的web UI模板库
4. 终极目标(有些人看了可能会笑话我):将business logic用画流程图的方式画出来, 让非技术人员业能用。呵呵, 真实现了的话,现在好多程序员要失业了。
screenshot 1: 展示语法高亮特性
screenshot 2: 展示智能感知和代码自动完成特性, 用c#开发的时候就和在visual studio差不多。
这是模板代码, 曾经用过mygeneration和codesmith的朋友肯定不陌生:
<%#REFERENCE System.dll,System.Windows.Forms.dll,CommonLib.dll,myEntity.dll%><%
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using CommonLib;
using CommonLib.DatabaseSchema;
using CommonLib.TemplateEngine;
using System.Windows.Forms;
using myEntity;
namespace ConsoleApplication1
{
public class TemplateProgram : MyTemplate
{
public static void Main(string[] args)
{
string strProjectFileName = Environment.GetEnvironmentVariable("ProjectFileName", EnvironmentVariableTarget.User);
DBSchemaEnv.PopulateDBSchemaEnvBasedOnProjectFile(strProjectFileName);
TemplateProgram templateProgram = new TemplateProgram();
Form1 frm = new Form1();
frm.strProjectFileName = strProjectFileName;
frm.Text = "Select table";
frm.ShowDialog();
TableInfo selectedTable = DBSchemaEnv.dbSchemas[frm.iDBInstance].tablesInfo[frm.iDBTable];
%>//*********************************************************
// xxx Company
// <%=DateTime.Now.ToString("yyyy-mm-dd")%> Author: <%=frm.strAuthorName%>
// The entity class of table <%=selectedTable.strTableName%>
//*********************************************************
using System;
using System.Collections.Generic;
namespace DataEntity
{
public class cls<%=selectedTable.strTableName%>
{
#region private members
<%
for (int i=0;i<selectedTable.columnsInfo.Count;i++)
{
ColumnInfo currentColumn = selectedTable.columnsInfo[i];
string strDeclareTypeName = ReturnBuiltInType(currentColumn.strColumnTypeName);
%> private <%=strDeclareTypeName%> <%=GetPrefixOfMembers(currentColumn)%><%=currentColumn.strColumnName%>;
<%
}
%> #endregion
#region Properties
<%
for (int i=0;i<selectedTable.columnsInfo.Count;i++)
{
ColumnInfo currentColumn = selectedTable.columnsInfo[i];
string strDeclareTypeName = ReturnBuiltInType(currentColumn.strColumnTypeName);
%> public <%=strDeclareTypeName%> <%=currentColumn.strColumnName.ToUpper()%>
{
get
{
return _<%=GetPrefixOfMembers(currentColumn)%><%=currentColumn.strColumnName%>;
}
set
{
<%=GetPrefixOfMembers(currentColumn)%><%=currentColumn.strColumnName%> = value;
}
}
<%
}
%> #endregion
}
}
<%
templateProgram.SaveOutputToFile(Application.StartupPath + """" + selectedTable.strTableName + ".cs");
MessageBox.Show("Hello");
}
public static string GetPrefixOfMembers(ColumnInfo oInputColumn)
{
string strResult = string.Empty;
if (oInputColumn.strColumnTypeName == "System.String")
{
strResult = "str";
}
else if (oInputColumn.strColumnTypeName == "System.Int32")
{
strResult = "i";
}
else if (oInputColumn.strColumnTypeName == "System.DateTime")
{
strResult = "date";
}
return strResult;
}
public static string ReturnBuiltInType(string strInput)
{
if (strInput == "System.String")
{
return "string";
}
else if (strInput == "System.Int32")
{
return "int";
}
return strInput;
}
}
}
%>
文章来源: http://www.cnblogs.com/mikelij/archive/2008/03/27/1123929.html