zoukankan      html  css  js  c++  java
  • 强大的代码生成工具MyGeneration

    MyGeneration是一个功能很强大的代码生成工具。通过编写包含各种类型脚本(C#,VB.Net,JScript,VBScript)的模板,通过数据库的表内容,生成你需要的各种代码。你可以用它来生成ORM的实体类,存储过程,SQL语句等等。我甚至用它来生成Asp.Net的页面(呵呵,我很懒)。

    MyGeneration提供了强大的在线模版库,你可以通过访问其网站或者使用Template Browser中的在线模版功能按钮寻找你需要的模版。当然你也可以根据需要自己写模板。

    我的NHibernate模板已经公布,并写了个随笔专门介绍它。详见“用我的MyGeneration模板生成NHibernate映射文件和关系(one-to-one,one-to-many,many-to-many) ”。

    你可以从这里下载它的最新版本。

    重要组件介绍

    它由几个重要的外部组件组成,其中常用的有以下两个

    MyMeta包含数据库中的信息。我们可以从这个库中获得想要的和数据库相关的信息。例如:数据库名,数据库里面的表,表里面的主键等等。

    Zeus为MyGeneration提供了一个的框架,里面最常用的就是一组对WinFrom组件封装后的一套组件,通过这套组件我们可以动态的生成我们需要的界面(我们可以在这个界面中让模版使用者选择使用的参数),然后界面里面的信息可以为生成模版服务。

    工作原理分析

    MyGeneration的支持用多种脚本模式,其工作原理是一致的,只是通过不同的语言来表达。

    我最常用的是C# Template。Template分为两个步骤运行,首先是通过脚本引擎执行Template Code和Interface Code中的脚本,生成Template Source和Interface Source的C#代码,然后执行Template Source,生成需要的代码。如下图

    Template Code模版简介

    C# Template Code的语法和Asp的语法十分的类似(注意Source是不能写代码的,那是根据你的Code生成的)。

    <%=%>表示绑定某一个字段或属性。

    <%%>表示脚本段,我们可以在这里写符合C#语法的任何语句。

    其他的内容不进行解析。直接用output写到最后的结果里。

    一般C#脚本会从DotNetScriptTemplate继承,DotNetScriptTemplate里面在Template Source里面可以看到他是从_DotNetScriptTemplate继承而来。Interface也类似。

     1 public abstract class DotNetScriptTemplate : _DotNetScriptTemplate
     2 {
     3     protected Zeus.UserInterface.GuiController ui;
     4     protected MyMeta.dbRoot MyMeta;
     5     protected Dnp.Utils.Utils DnpUtils;
     6     public DotNetScriptTemplate(IZeusContext context) : base(context)
     7 {
     8         this.ui = context.Objects["ui"] as    Zeus.UserInterface.GuiController;
     9         this.MyMeta = context.Objects["MyMeta"] as MyMeta.dbRoot;
    10         this.DnpUtils = context.Objects["DnpUtils"] as Dnp.Utils.Utils;
    11 }
    12 }

    DotNetScriptTemplate里面把模版需要使用到的数据库信息和界面信息也引用进来了,我们可以通过MyMeta来获得数据库里面的信息,而从ui里面获得和Template相关的参数设置信息。

    代码写在模版Render方法里。页面代码写在Setup方法里。

    使用配置文件

    MyGeneration支持配置文件的使用,在Edit里面的Default Settings...我们可以看到。

    Language Mapping定义了数据库和语言(C#,VB.Net等)的字段对应关系。

    Database Target Mapping定义了数据库和ADO.Net里面的字段对应关系。

    User Meta-Date允许用户设置自定义的配置文件。

    在模版中我们可以通过类似input["__dbDriver"]的语法来访问其中的内容。

    常见的有如下:

    __defaultOutputPath
    __dbDriver 
    __dbTarget
    __language
    __dbTargetMappingFileName
    __dbLanguageMappingFileName
    __userMetaDataFileName

    你可以看看模版目录里面的Tutorials/C#里面的Charpt1里面的示例(Charpt2也是个不错的例子,但写得有些繁琐)。

    快捷按钮详解

    Template Browser可以看到所有的模版。 

    第一个按钮作用是刷新。

    第二个按钮作用是切换显示模式。按照目录浏览和按照命名空间浏览。

    第三个按钮作用是查看在线模版库。

    第四个按钮作用是打开模版。

    第五个按钮和第六个按钮配合使用,点第六个运行时,参数将记录到你指定的znip文件里(其实是XML格式)中,下次运行时点第五个按钮,然后选到你保存的znip文件,将自动加载你的配置。

    第七个按钮是运行模版。

    第一个按钮作用是打开一个文件。

    第二个按钮作用是显示Template Browser窗口。

    第三个按钮作用是显示MyMeta Browser窗口,查看数据库信息。

    第四个按钮作用是新建一个项目。你可以使用多个模版完成你的任务(我一般不用)。

    第五个按钮作用是打开默认的输出路径。

    第六个按钮作用是新建JScript Template

    第七个按钮作用是新建VBScript Template

    第八个按钮作用是新建C# Template

    第九个按钮作用是新建VB.Net Template

    第十个按钮作用是查看MyMeta Property(不知道怎么用,会使用的还请指教下我)

    第十一个按钮作用是查看Language Mapping。

    第十二个按钮作用是查看DbTarget Mapping。

    第十三个按钮作用是查看User Meta Data。

    第十四个按钮作用是查看Global User Meta Data。

    第一个按钮作用是保存

    第二个按钮作用是另存

    第三个按钮作用是查看模版信息

    第四个按钮作用是显示控制台

    第五个按钮作用是运行模版

    试着写第一个模版

    在主菜单中选择File-->New-->C# Template。MyGeneration将会给你生成以下的模版代码。这是Template Code里面的内容。

     1 <%
     2 public class GeneratedTemplate : DotNetScriptTemplate
     3 {
     4     public GeneratedTemplate(ZeusContext context) : base(context) {}
     5 
     6     //---------------------------------------------------
     7     // Render() is where you want to write your logic    
     8     //---------------------------------------------------
     9     public override void Render()
    10     {
    11         %>
    12         You can toggle in out of script like this
    13         <%
    14         output.writeln("Hello world.");
    15     }
    16 
    17 }
    18 %>

    我们运行此模版可以看到输出。%><%里面的内容直接输出到结果,output.writeln的内容也输出到结果了。output是Interface里面自带的属性。有很多的功能。请参见Zeus的帮助文件。

     You can toggle in out of script like this
      Hello world.

    我们找到Interface Code,发现里面注释了些代码。我们把注释去掉后代码如下

     1 public class GeneratedGui : DotNetScriptGui
     2 {
     3     public GeneratedGui(ZeusContext context) : base(context) {}
     4 
     5     //-----------------------------------------
     6     // The User Interface Entry Point
     7     //-----------------------------------------
     8     public override void Setup()
     9     {
    10         // ** UNCOMMENT CODE BELOW TO SEE UI **
    11         ui.Width  = 100;
    12         ui.Height = 100;
    13         GuiLabel lblDemo = ui.AddLabel("lblDemo", "Demo", "Demo Tooltip");
    14         ui.ShowGui = true;
    15     }
    16 
    17 }

    运行模板。将会看到一个有Demo字体标签和Ok按纽的窗体。其中Demo字体标签是我们在代码中添加的。Ok按纽是模板自动设置,用来表示确定。

    我们来写一个模板来实现一个简单功能。界面上用一个下拉列表绑定数据库名称列表,选择数据库后生成数据库中的表的列表。代码如下

     1 public class GeneratedGui : DotNetScriptGui
     2 {
     3     public GeneratedGui(ZeusContext context) : base(context) {}
     4 
     5     //-----------------------------------------
     6     // The User Interface Entry Point
     7     //-----------------------------------------
     8     public override void Setup()
     9     {
    10         // ** UNCOMMENT CODE BELOW TO SEE UI **
    11         ui.Width  = 180;
    12         ui.Height = 120;
    13         ui.Title="First Template";//窗体的标题
    14         GuiLabel lblDatabase = ui.AddLabel("lblDatabase", "选择数据库", "选择数据库");
    15         GuiComboBox chooseDatabase = ui.AddComboBox( "chooseDatabase", "选择数据库" );
    16         chooseDatabase.Width=150;
    17         setupDatabaseDropdown(chooseDatabase);
    18         
    19         ui.ShowGui = true;
    20     }
    21 
    22     //绑定数据库
    23     public void setupDatabaseDropdown( GuiComboBox checkbox )
    24     {
    25         if( MyMeta.IsConnected )//如果MyMeta连接成功
    26         {
    27             checkbox.BindData( MyMeta.Databases );
    28         }
    29     }
    30 }
     1 <%
     2 public class GeneratedTemplate : DotNetScriptTemplate
     3 {
     4     public GeneratedTemplate(ZeusContext context) : base(context) {}
     5 
     6     //---------------------------------------------------
     7     // Render() is where you want to write your logic    
     8     //---------------------------------------------------
     9     public override void Render()
    10     {
    11         string _dbName = input["chooseDatabase"].ToString();
    12         
    13         
    14         
    15         foreach(ITable table in MyMeta.Databases[_dbName].Tables)
    16         {
    17             output.writeln(table.Alias);
    18         }
    19         
    20         output.writeln("**************************");
    21         
    22         foreach(ITable table in MyMeta.Databases[_dbName].Tables)
    23         {
    24 %><%=table.Alias%>
    25 <%
    26         }
    27     }
    28 
    29 }
    30 %>

    两个foreach可以作用是相同的,我这里写两个是为了展示<%=%>的绑定功能。你可能会问绑定的两行为什么顶行了,因为其中的空格会显示在结果中,你可以自己试试效果。
    其他代码很简单,我想大家都看得懂。

    运行它看看结果

    sysdiagrams
    T_Child
    T_Employee
    T_Employee1
    T_Parent
    T_Person
    T_Person1
    T_Role
    T_User
    T_User_Role
    **************************
    sysdiagrams
    T_Child
    T_Employee
    T_Employee1
    T_Parent
    T_Person
    T_Person1
    T_Role
    T_User
    T_User_Role

    呵呵,成功了。

    这只是个简单的示例。MyGeneration功能十分强大可以生成ORM的实体类,存储过程,SQL语句等等。
    如果你也想自己写模板,你可以多看看Zeus和MyMeta的帮助文件,多看别人写得模板。相信你很快也能写出功能强大的模版。

    文章地址:http://www.cnblogs.com/renrenqq/archive/2006/08/23/483988.html

  • 相关阅读:
    Windows 操作系统引导过程 BIOS & EFI
    Mac 系统引导过程概述 & BootCamp 的秘密
    Windows 10 安装 Ubuntu 子系统
    nrm 安装及报错处理
    司马懿人物关系
    大江大河
    曹操人物关系
    必要条件探路(导数)
    该题七种想法(一题一课之外接球)
    欧拉-查柏(Euler-Chapple)公式及其推广
  • 原文地址:https://www.cnblogs.com/qiernonstop/p/3763183.html
Copyright © 2011-2022 走看看