2013-10-24 54 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