2013-10-24 48 views
1

我有一個模板從數據庫中讀取需要生成的表格和對象。這是沒有問題的,模板確實生成相關的文件,每一個單獨在一個CSV文件(很好)我使用TemplateFileManager2.1來實現。這裏在表循環中,我想調用另一個模板來創建該表所需的接口,並使用循環中的表名將該接口放在不同的文件中。具有多個文件輸出的T4嵌套模板

foreach (var table in tables) 
    { 
     if(table.name !="sysdiagrams") 
     { 
     var manager2 = TemplateFileManager.Create(this); 
      manager2.StartNewFile(table.name+"mm.cs","Generator","Deneme"); 
      InterfaceGeneratora(table.name); 
      manager2.Process(); 
      manager2=null; 


     manager.StartNewFile(table.name+".cs","Generator","GeneratedTables"); 

這裏管理器對象用於輸出表類,而manager2用於接口。這裏的poit是當manager2被調用並且InterfaceGeneratora(table.name);運行manager2開始用新表intefarce替換創建的表接口,並在最後我創建了所有表類,但我只有最後一個表接口。任何幫助表示讚賞。

回答

4

據我所知,模板文件管理器替換了.Process()方法中以前生成的所有輸出文件。所以你應該在模板的最後調用.Process()方法。

爲了「外包」碼生成接口文件你既可以

  1. 使用的方法相同的模板內

    foreach(var table in tables) 
    { 
        if (table.name != "sysdiagrams") 
        { 
         manager.StartNewFile(table.name+"mm.cs", ...); 
         // create interface code 
        } 
    
        manager.StartNewFile(table.name, ...); 
        // create object code 
    } 
    manager.Process(); 
    
  2. 使用含有方法生成一個可包含的模板接口代碼通過<#@ include#>指令

    <#@ include file="interfaces.ttinclude" #> 
    foreach(var table in tables) 
    { 
        if (table.name != "sysdiagrams") 
         Interfacegeneratora(table.Name, manager); 
    
        // generate object code 
        manager.StartNewFile(table.name, ...); 
        // generate object code here 
    } 
    manager.Process(); 
    

    凡文件「interfaces.ttinclude」包含有類似

    <#+ void Interfacegeneratora(string tableName, TemplateFileManager manager) 
        { 
         manager.StartNewFile(tableName + "mm.cs", ...); 
         // generate interface code 
        } 
    #> 
    
  3. 過程中的另一個模板手動

    foreach(var table in tables) 
    { 
        if (table.name != "sysdiagrams") 
        { 
         var InterfaceT4 = new InterfaceTemplate(); 
         InterfaceT4.Session = new Dictionary<string, object>(); 
         InterfaceT4.Session.Add("tableName", table.name); 
         InterfaceT4.Session.Add("manager", manager); 
         InterfaceT4.InitializeSession(); 
         InterfaceT4.ProcessTemplate(); 
        } 
    
        manager.StartNewFile(table.Name, ...); 
        // generate object code 
    } 
    manager.Process(); 
    

    如果你創建另一個T4模板,名爲「InterfaceTemplate.tt」這是一個預處理的模板。這實現與.ttinclude文件相同的代碼。

注意:代碼沒有被雙重檢查,但顯示了它應該主要工作的方式。

希望有幫助, Nico