惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
S
Securelist
MyScale Blog
MyScale Blog
Jina AI
Jina AI
罗磊的独立博客
The Cloudflare Blog
美团技术团队
博客园 - 叶小钗
阮一峰的网络日志
阮一峰的网络日志
博客园 - 三生石上(FineUI控件)
月光博客
月光博客
雷峰网
雷峰网
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
大猫的无限游戏
大猫的无限游戏
博客园 - Franky
博客园 - 聂微东
Y
Y Combinator Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
MongoDB | Blog
MongoDB | Blog
T
Tailwind CSS Blog
Attack and Defense Labs
Attack and Defense Labs
博客园_首页
Latest news
Latest news
Apple Machine Learning Research
Apple Machine Learning Research
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The Hacker News
The Hacker News
G
GRAHAM CLULEY
Simon Willison's Weblog
Simon Willison's Weblog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
P
Proofpoint News Feed
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
U
Unit 42
D
Docker
Webroot Blog
Webroot Blog
N
Netflix TechBlog - Medium
T
Tor Project blog
C
Cyber Attacks, Cyber Crime and Cyber Security
L
LINUX DO - 最新话题
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
The Last Watchdog
The Last Watchdog
B
Blog
Recent Announcements
Recent Announcements
GbyAI
GbyAI
Microsoft Azure Blog
Microsoft Azure Blog
Security Latest
Security Latest
V2EX - 技术
V2EX - 技术
N
News | PayPal Newsroom
Microsoft Security Blog
Microsoft Security Blog

博客园 - 没肉包子

Vim as Python IDE on windows 如何在windows下安装"The Eric Python IDE" - 没肉包子 一个新的轮回,一个新的开始 一名英格兰球迷眼里的本届英格兰队 用我的MyGeneration模板生成NHibernate映射文件和关系(one-to-one,one-to-many,many-to-many) 请帮'Atlas'起个名字 - 没肉包子 - 博客园 NHibernate的关联映射(one-to-one,one-to-many,many-to-many)以及cascade分析 特里当选英格兰队新任队长 发疯的live.com NHibernate的Q&A(持续更新) NHibernate的调试技巧和Log4Net配置 诚邀博客链接 推荐两款在线日程(任务)管理的站点 NHibernate的数据库连接机制分析和如何使用外部连接 NHibernate的Session管理 有关NHibernate的问题请在此提出 [调查]如果你是个讲求编码规范的程序员,而碰到给变量、方法随意命名,注释又混乱的同事时你会怎么处理??? NHibernate的灵活配置 [转载]HTTP MIME类型即HttpResponse.ContentType属性值列表
强大的代码生成工具MyGeneration
没肉包子 · 2006-08-23 · via 博客园 - 没肉包子

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

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

重要组件介绍

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

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也类似。

public abstract class DotNetScriptTemplate : _DotNetScriptTemplate
{
    
protected Zeus.UserInterface.GuiController ui;
    
protected MyMeta.dbRoot MyMeta;
    
protected Dnp.Utils.Utils DnpUtils;
    
public DotNetScriptTemplate(IZeusContext context) : base(context)
{
        
this.ui = context.Objects["ui"as    Zeus.UserInterface.GuiController;
        
this.MyMeta = context.Objects["MyMeta"as MyMeta.dbRoot;
        
this.DnpUtils = context.Objects["DnpUtils"as Dnp.Utils.Utils;
}

}

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里面的内容。

<%
public class GeneratedTemplate : DotNetScriptTemplate
{
    
public GeneratedTemplate(ZeusContext context) : base(context) {}

    
//---------------------------------------------------
    
// Render() is where you want to write your logic    
    
//---------------------------------------------------
    public override void Render()
    
{
        
%>
        You can toggle 
in out of script like this
        
<%
        output.writeln(
"Hello world.");
    }


}

%>

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

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

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

public class GeneratedGui : DotNetScriptGui
{
    
public GeneratedGui(ZeusContext context) : base(context) {}

    
//-----------------------------------------
    
// The User Interface Entry Point
    
//-----------------------------------------
    public override void Setup()
    
{
        
// ** UNCOMMENT CODE BELOW TO SEE UI **
        ui.Width  = 100;
        ui.Height 
= 100;
        GuiLabel lblDemo 
= ui.AddLabel("lblDemo""Demo""Demo Tooltip");
        ui.ShowGui 
= true;
    }


}

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

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

public class GeneratedGui : DotNetScriptGui
{
    
public GeneratedGui(ZeusContext context) : base(context) {}

    
//-----------------------------------------
    
// The User Interface Entry Point
    
//-----------------------------------------
    public override void Setup()
    
{
        
// ** UNCOMMENT CODE BELOW TO SEE UI **
        ui.Width  = 180;
        ui.Height 
= 120;
        ui.Title
="First Template";//窗体的标题
        GuiLabel lblDatabase = ui.AddLabel("lblDatabase""选择数据库""选择数据库");
        GuiComboBox chooseDatabase 
= ui.AddComboBox( "chooseDatabase""选择数据库" );
        chooseDatabase.Width
=150;
        setupDatabaseDropdown(chooseDatabase);
        
        ui.ShowGui 
= true;
    }


    
//绑定数据库
    public void setupDatabaseDropdown( GuiComboBox checkbox )
    
{
        
if( MyMeta.IsConnected )//如果MyMeta连接成功
        {
            checkbox.BindData( MyMeta.Databases );
        }

    }

}

<%
public class GeneratedTemplate : DotNetScriptTemplate
{
    
public GeneratedTemplate(ZeusContext context) : base(context) {}

    
//---------------------------------------------------
    
// Render() is where you want to write your logic    
    
//---------------------------------------------------
    public override void Render()
    
{
        
string _dbName = input["chooseDatabase"].ToString();
        
        
        
        
foreach(ITable table in MyMeta.Databases[_dbName].Tables)
        
{
            output.writeln(table.Alias);
        }

        
        output.writeln(
"**************************");
        
        
foreach(ITable table in MyMeta.Databases[_dbName].Tables)
        
{
%><%=table.Alias%>
<%
        }

    }


}

%>

两个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的帮助文件,多看别人写得模板。相信你很快也能写出功能强大的模版。