強大的程式碼生成工具MyGeneration

NO IMAGE

 

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

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的幫助檔案,多看別人寫得模板。相信你很快也能寫出功能強大的模版。