[导入]Jing Code Generator介绍之一--媲美mygeneration和codesmith的代码生成器

时间:2021-12-03 12:52:05
作者 : 李竞
想法是 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: 展示语法高亮特性
[导入]Jing Code Generator介绍之一--媲美mygeneration和codesmith的代码生成器

screenshot 2: 展示智能感知和代码自动完成特性, 用c#开发的时候就和在visual studio差不多。
[导入]Jing Code Generator介绍之一--媲美mygeneration和codesmith的代码生成器

这是模板代码, 曾经用过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;

        }

    }

}

%>

[导入]Jing Code Generator介绍之一--媲美mygeneration和codesmith的代码生成器

mikelij 2008-03-27 01:10 发表评论

文章来源: http://www.cnblogs.com/mikelij/archive/2008/03/27/1123929.html