MyGenerataion的使用方式(三) - Transfer設計

MyGenerataion Template Transfer設計
這裡將提到Template設計過程中,Template Code的部分,也是Template的重點,我希望能夠在挑選完想要產生檔案的Table/View之後,透過Template Code產生出對應每個Table或View的C# class,節省開發的時間。
My Generation內建的範例Template中Toturial目錄下4種語言的範例,下面是空白C# Template的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.");
     }
}
%>
輸出結果如下,共四行分別因為特殊符號與[You can toggle in out of script like this]分別在不同行而系統幫忙輸出一次換行符號以及[Hello world.]是透過writeln的方式輸出而會在產生一行新行。
You can toggle in out of script like this
Hello world.
在開發的過程中,我們都是在Render() Method中處理轉換,而語法上是C#的語法沒錯,但是請注意上面特殊的符號>%、<%,在My Generation的Template Code中,於>%、<%範圍內的文字會判斷為C#程式碼來執行,而範圍外的等同於write效果,會直接輸出,以上述範例來說[You can toggle in out of script like this]這段文字會直接輸出。如果特殊符號會影響到原本要輸出的內容時,可以透過設定變更成另一種特殊符號避免轉換過程中使用到而造成解讀錯亂。在這樣特殊的設計下程式的閱讀會困難很多,但是在產生輸出模型來說,確是可以快速很多,這部分就交由後面的例子來感受。

範例:輸出檔案


string path = input["__defaultOutputPath"] as string;
path += "\\Chapter1.txt";
output.save(path, false);
output.writeln("");
output.writeln("All of this text was just saved to '" + path + "'");
在Render過程中,只要呼叫output.save的method就可以將save之前透過write輸出或特殊符號以外的文字寫入檔案。

範例:取得UI的變數值


public class GeneratedTemplate : DotNetScriptTemplate
{
    private ArrayList _selectedViews;
    private ArrayList _selectedTables;
    private string _database;
    private string _namespace;
    private string _outputPath;
    public override void Render()
    {
        _database = input["comboBoxDatabase"].ToString();
        _namespace= input["textBoxNamespace"].ToString();
        _outputPath=input["textBoxOutputpath"].ToString();
        _selectedViews=input["listBoxViews"] as ArrayList;
        _selectedTables=input["listBoxTables"] as ArrayList;
    }
}
透過上述的程式碼取得使用方式(二)所產生的UI每一個值,變數本身因為是C#的變數數值,因此在使用上比較不會有困難。

範例:產生Table C# Class


public void CreateClassByTableName(string tableName){
    output.clear();
    %>/* Create By Ray Wang (sheauren) <%=DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss")%>
    */
    using System;
    using System.Data;
    namespace <%=_namespace%>.VO{
        /// <summary>
        /// Generated by MyGeneration using Ray VO template.
        /// </summary>
        public class <%=tableName%>{
            <%CreateTableAttribute(tableName);%>
            <%CreateTableProperty(tableName);%>
        }
    }<%  output.save(_outputPath+"\\"+tableName+".cs","o");
    output.clear();
}
public void CreateTableAttribute(string tableName){
    %>  #region Attribute
    <%IColumns columns=MyMeta.Databases[_database].Tables[tableName].Columns;
    foreach(IColumn column in columns){
        %>  private <%=DBType2CSharpType(column.DataTypeName,column.CharacterMaxLength)%> _<%=column.Name%>;<%output.writeln("");
    }
%>  #endregion Attribute
<% } 
public void CreateTableProperty(string tableName){
    %>  #region Property
    <%IColumns columns=MyMeta.Databases[_database].Tables[tableName].Columns;
    foreach(IColumn column in columns){
        %>  public <%=DBType2CSharpType(column.DataTypeName,column.CharacterMaxLength)%&        gt; <%=column.Name%>{
        set{
            _<%=column.Name%>=value;
        }
        get{
            return _<%=column.Name%>;
        }
    }  
    <%output.writeln("");
 }
 %>  #endregion Property<%  
}

範例:MyGeneration資料型態轉成C#資料型態

public string DBType2CSharpType(string dbType,int length){
 switch(dbType){
  case "bigint":
   return "long";
  case "binary":
   return "byte[]";
  case "bit": 
   return "bool";
  case "char": 
   if(length==1){
    return "char";
   }
   else{
    return "string";
   }
  case "datetime": 
   return "DateTime";
  case "decimal": 
   return "Decimal";
  case "float":
   return "float";    
  case "image": 
   return "byte[]";
  case "money":
   return "float";
  case "int": 
   return "int";
  case "nchar": 
   return "string";
  case "ntext": 
   return "string";
  case "nvarchar": 
   return "string";
  case "real":
   return "double";
  case "smalldatetime": 
   return "DateTime";
  case "smallint": 
   return "short";
  case "smallmoney": 
   return "float";
  case "text": 
   return "string";
  case "timestamp":    
   return "DateTime";
  case "tinyint":    
   return "short";
  case "uniqueidentifier":    
   return "Guid";
  case "varbinary":    
   return "byte[]";
  case "varchar":    
   return "string";
  case "xml": 
   return "string";
  case "sql_variant":     
   return "object";
  default:
   return dbType;
 }
}

沒有留言:

橫式廣告