Sdílet prostřednictvím


Přístup k modelům z textových šablon

Pomocí šablony text můžete vytvořit sestavu souborů, souborů zdrojového kódu a další textové soubory, které jsou založeny na modely domény specifické pro jazyk.Základní informace o textu šablony Vytvoření kódu a textové šablony T4.Text šablony bude pracovat v režimu experimentální při ladění aplikace DSL a bude také pracovat na počítači, na který jste nainstalovali modem DSL.

[!POZNÁMKA]

Při vytváření řešení DSL, ukázkový text šablony *.tt soubory jsou generovány v ladění projektu.Při změně názvů tříd domény tyto šablony přestanou fungovat.Nicméně budou zahrnovat základní směrnic, které potřebujete a příklady, které lze aktualizovat tak, aby odpovídala vaší DSL.

Přístup k modelu z textu šablony:

  • Nastavte vlastnost dědění směrnice šablony ModelingTextTransformation.To poskytuje přístup k úložišti.

  • Určení směrnice procesorů pro DSL, které chcete získat přístup.Tak, aby jeho domény tříd, vlastností a vztahů můžete použít v kódu šablony text nahrají sestavení pro váš modem DSL.Načte také soubor modelu, který určíte.

A .tt podobně jako v následujícím příkladu vytvořen v ladění projektu při vytvoření nového Visual Studio řešení DSL minimální jazyk šablony.

<#@ template inherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation" #>
<#@ output extension=".txt" #>
<#@ MyLanguage processor="MyLanguageDirectiveProcessor" requires="fileName='Sample.myDsl1'" #>

This text will be output directly.

This is the name of the model: <#= this.ModelRoot.Name #>

Here is a list of elements in the model:
<#
  // When you change the DSL Definition, some of the code below may not work.
  foreach (ExampleElement element in this.ExampleModel.Elements)
  {#>
<#= element.Name #>
<#    
  }
#>

Všimněte si následující body o tuto šablonu:

  • Šablonu můžete použít v doméně tříd, vlastností a vztahů, které jsou definovány v definici DSL.

  • Šablona načte soubor modelu, které určíte v requires vlastnost.

  • Vlastnost v this obsahuje kořenový prvek.Odtud můžete kód přejít na jiné prvky modelu.Název vlastnosti je obvykle stejné jako třída kořenové domény vašeho DSL.V tomto příkladu je this.ExampleModel.

  • Ačkoli jazyk, ve kterém jsou zapsány fragmenty kódu jazyka C#, můžete vygenerovat text jakéhokoli druhu.Můžete také napsat kód v Visual Basic přidáním vlastnosti language="VB" se template směrnice.

  • Chcete-li ladit šablonu přidat debug="true" do template směrnice.Šablona se otevře v jiné instanci Visual Studio dojde k výjimce.Pokud chcete přejít k ladicímu na určitém místě v kódu, vložte, příkazSystem.Diagnostics.Debugger.Break();

    Další informace naleznete v tématu Ladění textové šablony T4.

O procesor směrnice DSL

Šablonu můžete použít DSL Definition definovaných tříd domény.To je způsobené směrnice, která se obvykle zobrazí u start šablony.V předchozím příkladu je následující.

<#@ MyLanguage processor="MyLanguageDirectiveProcessor" requires="fileName='Sample.myDsl1'" #>

Název směrnice ( MyLanguage, v tomto příkladu) je odvozen od názvu vaší DSL.Ji vyvolá směrnice procesoru která je vytvořena jako součást v DSL.Můžete najít jeho zdrojový kód v Dsl\GeneratedCode\DirectiveProcessor.cs.

Procesor směrnice DSL provádí dva hlavní úkoly:

  • Vloží účinně směrnic sestavení a importovat do šablony, který odkazuje váš DSL.To umožňuje použít vaší domény třídy v kódu šablony.

  • Načte zadaný v souboru requires parametr a nastaví vlastnost v this označuje kořenový prvek modelu načten.

Ověření před spuštěním šablony modelu

Může způsobit modelu, který má být ověřen před provedením šablony.

<#@ MyLanguage processor="MyLanguageDirectiveProcessor" requires="fileName='Sample.myDsl1';validation='open|load|save|menu'" #>

Všimněte si, že:

  1. filename a validation parametry jsou odděleny ";" a musí být bez oddělovače nebo mezery.

  2. Seznam kategorií, ověření určuje, jaké metody ověření bude provedeno.By měly být odděleny více kategorií "|" a musí být bez oddělovače nebo mezery.

Pokud je nalezena chyba, budou vykazovány v okně chyby a výsledek soubor bude obsahovat chybovou zprávu.

Přístup k více modelů z textu šablony

[!POZNÁMKA]

Tato metoda umožňuje číst více modelů ve stejné šablony, ale nepodporuje odkazy ModelBus.Modely, které jsou vzájemně propojena odkazy ModelBus, naleznete na Použití prvku Visual Studio ModelBus v textové šabloně.

Pokud chcete stejný text šablony přístup více než jeden model, musíte zavolat generované směrnice procesoru jednou pro každý model.Musíte zadat název souboru každého modelu v requires parametr.Je nutné zadat názvy, které chcete použít pro třídu kořenové domény v provides parametr.Je nutné zadat různé hodnoty pro provides parametry v každém směrnice volání.Předpokládejme například, že máte tři soubory modelu s názvem Library.xyz, School.xyz a Work.xyz.Přístup je ze stejné šablony text, musíte napsat tři směrnice volání, které se podobají následující ty.

<#@ ExampleModel processor="<YourLanguageName>DirectiveProcessor" requires="fileName='Library.xyz'" provides="ExampleModel=LibraryModel" #>
<#@ ExampleModel processor="<YourLanguageName>DirectiveProcessor" requires="fileName='School.xyz'" provides="ExampleModel=SchoolModel" #>
<#@ ExampleModel processor="<YourLanguageName>DirectiveProcessor" requires="fileName='Work.xyz'" provides="ExampleModel=WorkModel" #>

[!POZNÁMKA]

Tento příklad kódu je pro jazyk, který je založen na šabloně minimální jazykové řešení.

Přístup modely v šabloně text, můžete nyní psát kód podobný kód v následujícím příkladu.

<#
foreach (ExampleElement element in this.LibraryModel.Elements)
...
foreach (ExampleElement element in this.SchoolModel.Elements)
...
foreach (ExampleElement element in this.WorkModel.Elements)
...
#>
<#
For Each element As ExampleElement In Me.LibraryModel.Elements
...
For Each element As ExampleElement In Me.SchoolModel.Elements
...
For Each element As ExampleElement In Me.WorkModel.Elements
...
#>

Dynamické načítání modelů

Pokud chcete určit za běhu, které modely načíst, můžete načíst soubor modelu dynamicky v kódu programu, namísto použití směrnice specifické DSL.

Jednu z funkcí DSL zvláštní směrnice je však import DSL namespace kód šablony použít domény tříd definovaných v tomto DSL.Protože směrnice nepoužíváte, musíte přidat <assembly> a <import> směrnic pro všechny modely, které může načíst.Je to snadné, pokud jsou různé modely, které může načíst všechny instance stejného DSL.

Chcete-li načíst soubor je nejúčinnější pomocí Visual Studio ModelBus.V rámci typického scénáře text šablony pomocí DSL zvláštní směrnice načíst první model obvyklým způsobem.Tento model obsahuje odkazy ModelBus do jiného modelu.Můžete otevírat odkazované modelu a určitý prvek ModelBus.Další informace naleznete v tématu Použití prvku Visual Studio ModelBus v textové šabloně.

V méně obvyklý scénář, můžete otevřít soubor modelu, pro které máte pouze název souboru, a které pravděpodobně nebudou v aktuální Visual Studio projektu.V tomto případě otevřete soubor pomocí techniky popsané v Postupy: Otevření modelu ze souboru v kódu programu.

Generování více souborů ze šablony

Pokud chcete generovat několik souborů – například chcete-li vytvořit samostatný soubor pro každý prvek v modelu, existuje několik možných přístupů.Standardně se vyrábí pouze jeden soubor z každého souboru šablony.

Rozdělení dlouhých souborů

V této metodě generování jednoho souboru odděleny oddělovač použít šablonu.Potom soubor rozdělit na části.Existují dvě šablony, jeden generování jednoho souboru a ostatní jej rozdělit.

LoopTemplate.t4generuje dlouhý jeden soubor.Oznámení na, je jeho přípona souboru ".t4", je by měla zpracovat přímo po klepnutí na tlačítko Transformace všechny šablony.Tato šablona má parametr určuje oddělovač řetězec, který odděluje segmenty:

<#@ template ninherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation" #>
<#@ parameter name="delimiter" type="System.String" #>
<#@ output extension=".txt" #>
<#@ MyDSL processor="MyDSLDirectiveProcessor" requires="fileName='SampleModel.mydsl1';validation='open|load|save|menu'" #>
<#
  // Create a file segment for each element:
  foreach (ExampleElement element in this.ExampleModel.Elements) 
  { 
    // First item is the delimiter:
#>
<#= string.Format(delimiter, element.Id) #>

   Element: <#= element.Name #>
<#
   // Here you generate more content derived from the element.
  }
#>

LoopSplitter.ttVyvolá LoopTemplate.t4a výsledný soubor rozdělí jeho segmenty.Všimněte si, že tato šablona nemá být šablona vytváření modelů, protože nepodporuje čtení modelu.

<#@ template hostspecific="true" language="C#" #>
<#@ output extension=".txt" #>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #>
<#@ import namespace="System.Runtime.Remoting.Messaging" #>
<#@ import namespace="System.IO" #>

<#
  // Get the local path:
  string itemTemplatePath = this.Host.ResolvePath("LoopTemplate.t4");
  string dir = Path.GetDirectoryName(itemTemplatePath);

  // Get the template for generating each file:
  string loopTemplate = File.ReadAllText(itemTemplatePath);

  Engine engine = new Engine();
  
  // Pass parameter to new template:
  string delimiterGuid = Guid.NewGuid().ToString();
  string delimiter = "::::" + delimiterGuid + ":::";
  CallContext.LogicalSetData("delimiter", delimiter + "{0}:::"); 
  string joinedFiles = engine.ProcessTemplate(loopTemplate, this.Host);

  string [] separateFiles = joinedFiles.Split(new string [] {delimiter}, StringSplitOptions.None);

  foreach (string nameAndFile in separateFiles) 
  { 
     if (string.IsNullOrWhiteSpace(nameAndFile)) continue;
     string[] parts = nameAndFile.Split(new string[]{":::"}, 2, StringSplitOptions.None);
     if (parts.Length < 2) continue;
#>
 Generate: [<#= dir #>] [<#= parts[0] #>]
<#
     // Generate a file from this item:
     File.WriteAllText(Path.Combine(dir, parts[0] + ".txt"), parts[1]);  
  }
#>