2013-10-24 3 views
1

У меня есть шаблон, который считывает из базы данных таблицы, которые должны быть сгенерированы как и объекты. в этом нет никакой проблемы, шаблон создает связанный файл, каждый из которых один в файле cs (отлично) я использую TemplateFileManager2.1 для достижения этого. здесь, в цикле таблиц, я хотел бы вызвать другой шаблон для создания интерфейса, необходимого для этой таблицы, с использованием имени tablename в цикле и потушить этот интерфейс в другом файле.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"); 

Здесь объект-менеджер используется для размещения классов таблиц и менеджера2 для интерфейсов. poit здесь, когда вызывается manager2 и InterfaceGeneratora (table.name); run manager2 начинает заменять созданный tableinterface новой таблицей 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. использовать includable шаблон, содержащий метод, генерирующий код интерфейса через < # @ 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

Смежные вопросы