T4嵌套模板可生成多个文件的输出

3

我有一个模板,从数据库中读取需要作为对象生成的表。在这方面没有问题,模板确实会生成相关文件,每个表都会被单独生成到一个cs文件中(很好)。我使用TemplateFileManager2.1来实现这一点。在表的循环中,我想调用另一个模板来创建所需的接口,并使用循环中的表名将该接口输出到不同的文件中。

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"); 

这里使用manager对象来输出tables类,而manager2是用于接口。重点在于当调用manager2时,InterfaceGeneratora(table.name);开始用新的table interface替换已创建的tableinterface,最后所有table class都被成功创建了,但我只手头上只有最后一个table interface。任何帮助都将不胜感激。

1个回答

6
据我所知,模板文件管理器在.Process()方法中替换所有先前生成的输出文件。因此,您应该在模板的最后调用.Process()方法。
为了“外包”生成界面文件的代码,您可以选择以下两种方式:
  1. use a method inside the same template

    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. use a includable template containing a method generating the interface code via the <#@ include #> directive

    <#@ 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();
    

    Where the file "interfaces.ttinclude" contains something like

    <#+ void Interfacegeneratora(string tableName, TemplateFileManager manager)
        {
            manager.StartNewFile(tableName + "mm.cs", ...);
            // generate interface code
        }
    #>
    
  3. process another template manually

    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();
    

    Where you create another T4 template, named "InterfaceTemplate.tt" that is a Preprocessed template. That realizes the same code as the .ttinclude file.

注意:代码没有经过双重检查,但展示了其原理上应该如何工作。
希望有所帮助, Nico

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接