开发.Net Script 模板-MyGeneration (翻译)

原文信息

  • 原文地址

  • 原文作者信息

    • Justin Greenwood

    • MyGeneration Software

    • http://www.mygenerationsoftware.com/

    • October 7, 2004

系统需求:

  • Microsoft Windows 2000/XP

  • Microsoft .Net Framework 1.1/更高

  • MDAC 2.7/更高

  • MyGeneration

概观

MyGeneration目前使用了两种脚本引擎,一个是Microsoft Scripting
Engine,它提供了JScript和VBScript的生成支持;另一个是 DotNetScript ,它提供了 VB.NET 和 C# 的支持。
DotNetScript 不像Microsoft Scripting Control那样的真正的脚本。实际上,它在运行时编译代码,然后利用编译后的.NET
Assembly执行代码。这个教程通过例子说明使用 DotNetScript
开发MyGeneration模板的赞成与反对的理由。在这个例子中,我将使用C#和MS SQL中附带的Northwind数据库。

创建一个新的C#模板

    • 打开MyGeneration

    • 通过File->New->C# Template创建一个新的模板

    • 点击属性按钮编辑模板的属性

    • 如下图,填充模板的属性

    • 保存模板

研究默认的模板代码
默认的模板主体代码: 不像
JScript 或VBScript,C#的的模板代码相对较少。这个默认的代码是非常重要的。一个C#模板必须有一个继承了 DotNetScriptTemplate
的名为 GeneratedTemplate 的类。 MyGeneration 通过实例化 GeneratedTemplate
,并调用Render方法开始生成过程。几乎大部分的模板开发工作都在Render方法里面完成。试试执行这个模板,你将会看到literal content goes
here作为输出出现。


 1 <%
2 public class GeneratedTemplate : DotNetScriptTemplate
3 {
4 public GeneratedTemplate(ZeusContext context) : base(context) {}
5
6
7 public override void Render()
8 {
9 %>
10 Literal content goes here.
11 <%
12 }
13
14
15 }
16 %>

默认的UI接口代码: 在默认的模板的接口代码中,同样需要一个名为GeneratedGui的,继承DotNetScriptGui的强制类。如同模板主体代码的Render方法一样,
MyGeneration 将调用Setup方法开始显示用户接口并收集输入。


1 public class GeneratedGui : DotNetScriptGui
2 {
3 public GeneratedGui(ZeusContext context) : base(context) {}
4
5
6 public override void Setup()
7 {
8 }
9 }

获取输入:用户接口的代码块 在这个例子中,用户将通过接口选择一个表。这个是接口代码块的擅长的工作。用户接口获取的输入数据,将在模板主体代码中用来生成代码。

使用MyGeneration的接口代码:


 1 public class GeneratedGui : DotNetScriptGui
2 {
3 public GeneratedGui(ZeusContext context) : base(context) {}
4
5
6 public override void Setup()
7 {
8 ui.Title = ".NetScript C# Sample: Java Class";
9 ui.Width = 340;
10 ui.Height = 200;
11
12
13 // Setup Database selection combobox.
14 GuiLabel label_d = ui.AddLabel("lblDatabases", "Select a database:", "Select a database in the dropdown below.");
15 GuiComboBox cmbDatabases = ui.AddComboBox("databaseName", "Select a database.");
16
17
18 // Setup Tables selection multi-select listbox.
19 GuiLabel label_t = ui.AddLabel("lblTables", "Select table:", "Select table from the combobox below.");
20 GuiComboBox cmbTables = ui.AddComboBox("tableName", "Select a table.");
21
22
23 // bind data to the controls
24 cmbDatabases.BindData(MyMeta.Databases);
25 cmbDatabases.SelectedValue = MyMeta.DefaultDatabase.Name;
26 cmbTables.BindData( MyMeta.Databases[cmbDatabases.SelectedValue].Tables );
27
28 // Attach the onchange event to the cmbDatabases control.
29 cmbDatabases.AttachEvent("onchange", "cmbDatabases_onchange");
30
31 ui.ShowGui = true;
32 }
33
34
35 public void cmbDatabases_onchange(GuiComboBox control)
36 {
37 GuiComboBox cmbDatabases = ui["databaseName"] as GuiComboBox;
38 GuiComboBox cmbTables = ui["tableName"] as GuiComboBox;
39
40
41 cmbTables.BindData( MyMeta.Databases[cmbDatabases.SelectedValue].Tables );
42 }
43 }

使用.NET Windows Form API的接口代码:
下面的代码是不使用 MyGeneration
API的替换方案,它可以达到与上面的代码同样的目的。


 1 <%#REFERENCE System.Windows.Forms.dll %>
2 <%#NAMESPACE System.Windows.Forms %>
3 public class GeneratedGui : DotNetScriptGui
4 {
5 public GeneratedGui(ZeusContext context) : base(context) {}
6
7
8 public override void Setup()
9 {
10 AcquireInputForm form = new AcquireInputForm(MyMeta, input);
11
12
13 if (form.ShowDialog() != DialogResult.OK)
14 {
15 ui.IsCanceled = true;
16 }
17 }
18 }
19
20
21 public class AcquireInputForm : Form
22 {
23 private ComboBox cboDatabases = new ComboBox();
24 private ComboBox cboTables = new ComboBox();
25 private Button btnOk = new Button();
26 private dbRoot meta;
27 private IZeusInput input;
28
29
30 public AcquireInputForm(dbRoot mymeta, IZeusInput zin)
31 {
32 this.meta = mymeta;
33 this.input = zin;
34
35
36 this.BindComboBox(cboDatabases, meta.Databases);
37 cboDatabases.SelectedItem = meta.DefaultDatabase.Name;
38 cboDatabases.Top = 10; cboDatabases.Left = 10; cboDatabases.Width = 200;
39 cboDatabases.SelectedIndexChanged += new EventHandler(cboDatabases_SelectedIndexChanged);
40
41
42 this.BindComboBox(cboTables, meta.DefaultDatabase.Tables);
43 cboTables.Top = 50; cboTables.Left = 10; cboTables.Width = 200;
44
45
46 btnOk.Text = "Ok";
47 btnOk.Top = 100; btnOk.Left = 10; btnOk.Width = 200;
48 btnOk.Click += new EventHandler(btnOk_Click);
49
50
51 this.Controls.AddRange( new Control[] {cboDatabases, cboTables, btnOk} );
52 this.Text = ".NetScript C# Sample: Java Class";
53 this.Width = 230;
54 this.Height = 160;
55 }
56
57
58 public void cboDatabases_SelectedIndexChanged(object sender, EventArgs args)
59 {
60 this.BindComboBox(
61 cboTables,
62 meta.Databases[ cboDatabases.SelectedItem.ToString() ].Tables
63 );
64 }
65
66
67 public void btnOk_Click(object sender, EventArgs args)
68 {
69 if ((cboDatabases.SelectedIndex >= 0) &&
70 (cboTables.SelectedIndex >= 0))
71 {
72 input["databaseName"] = cboDatabases.SelectedItem.ToString();
73 input["tableName"] = cboTables.SelectedItem.ToString();
74 this.DialogResult = DialogResult.OK;
75 this.Close();
76 }
77 else
78 {
79 MessageBox.Show("Fill out the required fields.. PLEASE??");
80 }
81 }
82
83
84 private void BindComboBox(ComboBox cbo, IEnumerable myMetaCollection)
85 {
86 cbo.Items.Clear();
87 foreach (INameValueItem item in myMetaCollection)
88 {
89 cbo.Items.Add(item.ItemValue);
90 }
91 }
92 }

模板主体  模板主体是生成代码的主要执行地。下面讲解了我如何生成代码的步骤。

1、将期望输出的代码放入到Render的方法中如下的代码,你将看到我将要生成的类。这几乎都是当我要生成一个模板是必做的第一件事情。


 1 <%
2 public class GeneratedTemplate : DotNetScriptTemplate
3 {
4 public GeneratedTemplate(ZeusContext context) : base(context) {}
5
6
7 public override void Render()
8 {
9 string databaseName = input["databaseName"].ToString();
10 string tableName = input["tableName"].ToString();
11 %>
12 /*
13 * Employee.java
14 *
15 * Created on September 23, 2002, 12:59 PM
16 */
17
18
19 package com.mygeneration.sample;
20
21
22 import java.sql.*;
23
24
25 import com.mygeneration.businessobjects.*;
26 import com.mygeneration.dataaccess.*;
27
28
29 public class Employee extends BizObj
30 {
31 public Employee()
32 {
33 }
34
35
36 // EmployeeID
37 public String getEmployeeID()
38 {
39 return getString(EmployeeSchema.EmployeeID.getFieldName());
40 }
41
42
43 public void setEmployeeID(String employeeID)
44 {
45 setString(EmployeeSchema.EmployeeID.getFieldName(), employeeID);
46 }
47 }<%
48 }
49
50
51 }
52 %>

2、添加动态代码把动态的代码添加到模板中,替换掉类名、属性名称以及数据类型。


 1 <%
2 public class GeneratedTemplate : DotNetScriptTemplate
3 {
4 public GeneratedTemplate(ZeusContext context) : base(context) {}
5
6
7 public override void Render()
8 {
9 string databaseName = input["databaseName"].ToString();
10 string tableName = input["tableName"].ToString();
11
12
13 IDatabase database = MyMeta.Databases[databaseName];
14 ITable table = database.Tables[tableName];
15 %>/*
16 * <%= table.Alias %>.java
17 *
18 * Created on <%= DateTime.Now.ToString() %>
19 */
20
21
22 package com.mygeneration.sample;
23
24
25 import java.sql.*;
26
27
28 import com.mygeneration.businessobjects.*;
29 import com.mygeneration.dataaccess.*;
30
31
32 public class <%= table.Alias %> extends BizObj
33 {
34 public <%= table.Alias %>()
35 {
36 }
37 <%
38 foreach (IColumn column in table.Columns)
39 {
40 string datatype = this.GetJavaType(column);
41 %>
42 // <%= column.Alias %>
43 public <%= datatype %> get<%= column.Alias %>()
44 {
45 return get<%= datatype %>(<%= table.Alias %>Schema.<%= column.Alias %>.getFieldName());
46 }
47
48
49 public void set<%= column.Alias %>(<%= datatype %> m_<%= column.Alias %>)
50 {
51 set<%= datatype %>(<%= table.Alias %>Schema.<%= column.Alias %>.getFieldName(), m_<%= column.Alias %>);
52 }
53 <%
54 }
55 %>
56 }<%
57 }
58
59
60 private string GetJavaType(IColumn column)
61 {
62 string sqlServerType = column.DataTypeName;
63 int charLength = column.CharacterMaxLength;
64
65
66 switch (sqlServerType)
67 {
68 case "bit":
69 return "Boolean";
70 case "decimal":
71 case "float":
72 case "numeric":
73 case "money":
74 case "smallmoney":
75 case "real":
76 return "Decimal";
77 case "tinyint":
78 case "smallint":
79 case "int":
80 case "bigint":
81 return "Integer";
82 case "smalldatetime":
83 case "datetime":
84 return "Timestamp";
85 case "varchar":
86 case "char":
87 case "nvarchar":
88 case "nchar":
89 case "text":
90 if (charLength == 1)
91 return "Character";
92 else
93 return "String";
94 default:
95 return "Object";
96 }
97 }
98 }
99 %>

总结

使用 DotNetScript ,你将会把 MyGeneration 的模板开发提升到一个新的水平,提供更强大的功能以及能开发更复杂的系统。

开发.Net Script 模板-MyGeneration (翻译)

时间: 2024-10-07 04:43:41

开发.Net Script 模板-MyGeneration (翻译)的相关文章

HTML5页面开发的基础性模板

分享一个HTML5页面开发的基础性模板,包含了两个版本: 开发版本 注释版本 开发版本 <!DOCTYPE html> <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta charset="utf-8"> <title></title> <meta name=&q

jquery开发网站后台模板源代码下载

原文:jquery开发网站后台模板源代码下载 源代码下载地址:http://www.zuidaima.com/share/1550463634934784.htm 这效果怎么样????

.NET微信公众号开发-6.0模板消息

一.前言 为了保证用户不受到骚扰,在开发者出现需要主动提醒.通知用户时,才允许开发者在公众平台网站中模板消息库中选择模板,选择后获得模板ID,再根据模板ID向用户主动推送提醒.通知消息.这个意思也就是,我们作为微信商户,不能主动的给用户推送消息,如果这个功能完全开放,那么用户有可能会受到大量的垃圾信息,为了做一个很好的控制,微信那边给我们开放了一个模板消息,通过模板消息我们可以友好的给用户发送一些相关的消息提醒. 二.开发前的准备 1.0模板消息官方文档地址 2.0查看我们的模板消息是否申请成功

谷歌工程师利用和语言翻译类似的技术开发出了一个用于翻译图片主题的机器学习算法

将一种语言自动翻译成另一种语言一直以来都是难以攻克的问题.但最近几年,谷歌通过开发机器翻译算法改变了传统的翻译过程,通过谷歌翻译从本质上改变了跨文化翻译交流. 如今,谷歌正在运用同样的机器学习技术将图片转变为文字.其结果就是自动产生能够准确描述图片内容的标题.该技术将用在互联网搜索引擎,图片自动发表,视觉受损者的网页浏览,以及其他更为广阔的领域. 翻译语言的传统步骤是一个更迭的过程 - 从个体单词的翻译开始,然后通过重新排列单词和短语的顺序来提高翻译的准确性.但是近几年来,通过完全不同的方式,谷

实际开发中的模板设计模式

最近的项目中,在使用spring+springJBDC 开发时,从一开始的一脸懵逼到越来越顺手,着一切,都归功于一大堆的封装方法.在这里,记录两个非常有用方法以便查阅学习 一. 组合查询的基础类(BaseCondition) 该类中,抽取了常用的组合查询的公共属性和方法,例如:分页查询中使用的 pagaSize// 页大小.pageNumber// 当前页码.rowCount;// 记录总数 rowCount;// 记录总数 拼接sql语句使用的多个重载add()方法,更据不同数据类型重载; 最

基于Velocity开发自己的模板引擎

Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象. 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只 关注页面的显示效果,而由java程序开发人员关注业务逻辑编码.Velocity将java代码从web页面中分离出来,这样为web站点的长期维护提 供了便利,同时也为我们

uwp开发:数据模板选择器

这两天,在做<简影uwp>的首页推荐版块时,用到了数据模板选择器,所以简单介绍一下.数据模板选择器.顾名思义,就是可以选择性的展示不同的数据模板.那么,什么时候用数据模板选择器?怎么用呢?往下看: 应用场景: 同样是以我目前正在做的<简影uwp>为例,在做首页推荐版块时,要展示的数据是不同的版块的,都放在了一个集合中,这样的话,如果直接将数据绑定到ListView或者GridView上显示的话,是不可取的.虽然这些数据在一个集合内,但是因为集合内每个种类都不一样,显示的方式,展示的

.NET MVC插件化开发(支持Script和css压缩)

上一篇博文里面,没有支持Script和css的压缩功能以及script和css的路径问题也没有解决,所以重新发布一个版本,解决了这几个问题,并且优化了插件路由注册,现在可以很方便的实现热插拔web插件,但web插件热插拔需要对路由表进行修改,如果是线上项目,热插拔期间可能会有请求异常,所以暂时不提供web热插拔,插件安装应该有计划的在维护期间进行,如果大家都希望启用web插件热插拔,我可以很快提供给大家,大家可以一起多多沟通,毕竟我个人的见解有限. 这里先简单介绍下新版改动: 大家看插件里的这两

unity自定义script模板

以mac为例,在/Applications/Unity/Unity.app/Contents/Resources/ScriptTemplates/ 新建1个模板文件:91-C# YourNameSpaceScript-NewBehaviourScript.cs.txt using System.Collections; using System.Collections.Generic; using UnityEngine; namespace YourNameSpace { public cla