Aracılığıyla paylaş


T4 Metin Şablonları İle Çalışma Süresi Metni Oluşturma

Visual Studio çalışma zamanı metin şablonlarını kullanarak uygulamanızda çalışma zamanında metin dizeleri oluşturabilirsiniz. Uygulamanın yürütüldüğü bilgisayarda Visual Studio olması gerekmez. Çalışma zamanı şablonları bazen "önceden işlenmiş metin şablonları" olarak adlandırılır, çünkü derleme zamanında şablon çalışma zamanında yürütülen kodu oluşturur.

Her şablon, oluşturulan dizede ve program kodunun parçalarında görüneceğinden metnin bir karışımıdır. Program parçaları, dizenin değişken bölümleri için değerler sağlar ve koşullu ve yinelenen bölümleri de denetler.

Örneğin, aşağıdaki şablon HTML raporu oluşturan bir uygulamada kullanılabilir.

<#@ template language="C#" #>
<html><body>
<h1>Sales for Previous Month</h2>
<table>
    <# for (int i = 1; i <= 10; i++)
       { #>
         <tr><td>Test name <#= i #> </td>
             <td>Test value <#= i * i #> </td> </tr>
    <# } #>
 </table>
This report is Company Confidential.
</body></html>

Şablonun, değişken bölümlerinin program koduyla değiştirildiği bir HTML sayfası olduğuna dikkat edin. Html sayfasının statik bir prototipini yazarak böyle bir sayfanın tasarımına başlayabilirsiniz. Daha sonra tabloyu ve diğer değişken bölümlerini, bir durumdan diğerine değişen içeriği oluşturan program koduyla değiştirebilirsiniz.

Uygulamanızda şablon kullanmak, çıktının son biçimini görmeyi, örneğin uzun bir yazma deyimleri serisinde görebileceğinizden daha kolay hale getirir. Çıktı biçiminde değişiklik yapmak daha kolay ve daha güvenilirdir.

Herhangi bir Uygulamada Çalışma Zamanı Metin Şablonu Oluşturma

Çalışma zamanı metin şablonu oluşturmak için

  1. Çözüm Gezgini'da, projenizin kısayol menüsünde Yeni Öğe Ekle'yi>seçin.

  2. Yeni Öğe Ekle iletişim kutusunda Çalışma Zamanı Metin Şablonu'nu seçin. (Visual Basic'te Genel Ortak Öğeler>.)

  3. Şablon dosyanız için bir ad yazın.

    Not

    Şablon dosya adı, oluşturulan kodda sınıf adı olarak kullanılır. Bu nedenle boşluk veya noktalama işareti olmamalıdır.

  4. Ekle'yi seçin.

    Uzantısı .tt olan yeni bir dosya oluşturulur. Özel Araç özelliği TextTemplatingFilePreprocessor olarak ayarlanır. Aşağıdaki satırları içerir:

    <#@ template language="C#" #>
    <#@ assembly name="System.Core" #>
    <#@ import namespace="System.Linq" #>
    <#@ import namespace="System.Text" #>
    <#@ import namespace="System.Collections.Generic" #>
    
  5. System.CodeDom NuGet paketine bir başvuru ekleyin.

Mevcut Bir Dosyayı Çalışma Zamanı Şablonuna Dönüştürme

Şablon oluşturmanın iyi bir yolu, çıktının mevcut bir örneğini dönüştürmektir. Örneğin, uygulamanız HTML dosyaları oluşturacaksa, düz bir HTML dosyası oluşturarak başlayabilirsiniz. Doğru çalıştığından ve görünümünün doğru olduğundan emin olun. Ardından Visual Studio projenize ekleyin ve bir şablona dönüştürün.

Var olan bir metin dosyasını çalışma zamanı şablonuna dönüştürmek için

  1. Dosyayı Visual Studio projenize ekleyin. Çözüm Gezgini'da, projenin kısayol menüsünde Varolan Öğeyi Ekle'yi>seçin.

  2. Dosyanın Özel Araçlar özelliğini TextTemplatingFilePreprocessor olarak ayarlayın. Çözüm Gezgini dosyasının kısayol menüsünde Özellikler'i seçin.

    Not

    Özelliği zaten ayarlanmışsa, TextTemplatingFileGenerator değil TextTemplatingFilePreprocessor olduğundan emin olun. .tt uzantısına sahip bir dosya eklerseniz bu durum oluşabilir.

  3. Dosya adı uzantısını .tt olarak değiştirin. Bu adım isteğe bağlı olsa da, dosyayı yanlış bir düzenleyicide açmamanıza yardımcı olur.

  4. Dosya adının ana bölümünden boşlukları veya noktalama işaretlerini kaldırın. Örneğin, "Web Page.tt" yanlış olabilir, ancak "MyWebPage.tt" doğrudur. Dosya adı, oluşturulan kodda sınıf adı olarak kullanılır.

  5. Dosyanın başına aşağıdaki satırı ekleyin. Visual Basic projesinde çalışıyorsanız, "C#" yerine "VB" yazın.

    <#@ template language="C#" #>

  6. System.CodeDom NuGet paketine bir başvuru ekleyin.

Çalışma Zamanı Şablonunun İçeriği

Şablon yönergesi

Şablonun ilk satırını dosyayı oluştururken olduğu gibi tutun:

<#@ template language="C#" #>

Language parametresi projenizin diline bağlıdır.

Düz içerik

.tt dosyasını, uygulamanızın oluşturmasını istediğiniz metni içerecek şekilde düzenleyin. Örneğin:

<html><body>
<h1>Sales for January</h2>
<!-- table to be inserted here -->
This report is Company Confidential.
</body></html>

Eklenmiş program kodu

ve #>arasına <# program kodu ekleyebilirsiniz. Örneğin:

<table>
    <# for (int i = 1; i <= 10; i++)
       { #>
         <tr><td>Test name <#= i #> </td>
             <td>Test value <#= i * i #> </td> </tr>
    <# } #>
 </table>

deyimlerinin arasına <# ... #> eklendiğine ve ifadelerin arasına <#= ... #>eklendiğine dikkat edin. Daha fazla bilgi için bkz . T4 Metin Şablonu Yazma.

Şablonu Kullanma

Şablondan oluşturulan kod

.tt dosyasını kaydettiğinizde, bir yan .cs veya .vb dosyası oluşturulur. Bu dosyayı Çözüm Gezgini görmek için .tt dosya düğümünü genişletin. Visual Basic projesinde, önce Çözüm Gezgini araç çubuğunda Tüm Dosyaları Göster'i seçin.

Yan dosyanın adlı TransformText()bir yöntemi içeren kısmi bir sınıf içerdiğine dikkat edin. Bu yöntemi uygulamanızdan çağırabilirsiniz.

Çalışma zamanında metin oluşturma

Uygulama kodunuzda, aşağıdaki gibi bir çağrı kullanarak şablonunuzun içeriğini oluşturabilirsiniz:

MyWebPage page = new MyWebPage();
String pageContent = page.TransformText();
System.IO.File.WriteAllText("outputPage.html", pageContent);

Oluşturulan sınıfı belirli bir ad alanına yerleştirmek için, metin şablonu dosyasının Özel Araç Ad Alanı özelliğini ayarlayın.

Çalışma Zamanı Metin Şablonlarında Hata Ayıklama

Çalışma zamanı metin şablonlarında normal kodla aynı şekilde hata ayıklama ve test etme.

Metin şablonunda kesme noktası ayarlayabilirsiniz. Uygulamayı Visual Studio'dan hata ayıklama modunda başlatırsanız kodda adım adım ilerleyebilir ve izleme ifadelerini normal şekilde değerlendirebilirsiniz.

Oluşturucuda parametreleri geçirme

Genellikle bir şablonun uygulamanın diğer bölümlerinden bazı verileri içeri aktarması gerekir. Bunu kolaylaştırmak için şablon tarafından oluşturulan kod kısmi bir sınıftır. Projenizdeki başka bir dosyada aynı sınıfın başka bir bölümünü oluşturabilirsiniz. Bu dosya hem şablona eklenmiş kod tarafından hem de uygulamanın geri kalanı tarafından erişilebilen parametrelere, özelliklere ve işlevlere sahip bir oluşturucu içerebilir.

Örneğin, MyWebPageCode.cs ayrı bir dosya oluşturabilirsiniz:

partial class MyWebPage
{
    private MyData m_data;
    public MyWebPage(MyData data) { this.m_data = data; }}

Şablon dosyanızda MyWebPage.tt şunları yazabilirsiniz:

<h2>Sales figures</h2>
<table>
<# foreach (MyDataItem item in m_data.Items)
   // m_data is declared in MyWebPageCode.cs
   { #>
      <tr><td> <#= item.Name #> </td>
          <td> <#= item.Value #> </td></tr>
<# } // end of foreach
#>
</table>

Bu şablonu uygulamada kullanmak için:

MyData data = ...;
MyWebPage page = new MyWebPage(data);
String pageContent = page.TransformText();
System.IO.File.WriteAllText("outputPage.html", pageContent);

Visual Basic'te oluşturucu parametreleri

Visual Basic'te, ayrı dosya MyWebPageCode.vb şunları içerir:

Namespace My.Templates
  Partial Public Class MyWebPage
    Private m_data As MyData
    Public Sub New(ByVal data As MyData)
      m_data = data
    End Sub
  End Class
End Namespace

Şablon dosyası aşağıdakileri içerebilir:

<#@ template language="VB" #>
<html><body>
<h1>Sales for January</h2>
<table>
<#
    For Each item In m_data.Items
#>
    <tr><td>Test name <#= item.Name #> </td>
      <td>Test value <#= item.Value #> </td></tr>
<#
    Next
#>
</table>
This report is Company Confidential.
</body></html>

Şablon, oluşturucuya parametresi geçirilerek çağrılabilir:

Dim data = New My.Templates.MyData
    ' Add data values here ....
Dim page = New My.Templates.MyWebPage(data)
Dim pageContent = page.TransformText()
System.IO.File.WriteAllText("outputPage.html", pageContent)

Şablon özelliklerine veri geçirme

Verileri şablona geçirmenin alternatif bir yolu, şablon sınıfına kısmi sınıf tanımında genel özellikler eklemektir. Uygulamanız çağırmadan TransformText()önce özelliklerini ayarlayabilir.

Şablon sınıfınıza kısmi bir tanımda alanlar da ekleyebilirsiniz. Bu, şablonun ardışık yürütmeleri arasında veri geçirmenizi sağlar.

Kod için kısmi sınıflar kullanma

Birçok geliştirici şablonlarda büyük kod gövdeleri yazmaktan kaçınmayı tercih eder. Bunun yerine, şablon dosyasıyla aynı ada sahip kısmi bir sınıfta yöntemler tanımlayabilirsiniz. Şablondan bu yöntemleri çağırın. Bu şekilde şablon, hedef çıkış dizesinin nasıl görüneceğini daha net bir şekilde gösterir. Sonucun görünümüyle ilgili tartışmalar, görüntülenen verileri oluşturma mantığından ayrılabilir.

Derlemeler ve başvurular

Şablon kodunuzun bir .NET'e veya System.Xml.dll gibi başka bir derlemeye başvurmasını istiyorsanız, bunu projenizin Başvurularına her zamanki gibi ekleyin.

Ad alanını deyimiyle aynı şekilde using içeri aktarmak istiyorsanız, bunu şu yönergeyle import yapabilirsiniz:

<#@ import namespace="System.Xml" #>

Bu yönergeler, yönergeden hemen sonra <#@template dosyanın başına yerleştirilmelidir.

Paylaşılan içerik

Birkaç şablon arasında paylaşılan bir metniniz varsa, bunu ayrı bir dosyaya yerleştirebilir ve gösterilmesi gereken her dosyaya ekleyebilirsiniz:

<#@include file="CommonHeader.txt" #>

Dahil edilen içerik herhangi bir program kodu ve düz metin karışımı içerebilir ve diğer dahil yönergelerini ve diğer yönergeleri içerebilir.

include yönergesi, bir şablon dosyasının veya eklenen bir dosyanın metni içinde herhangi bir yerde kullanılabilir.

Çalışma Zamanı Metin Şablonları arasında devralma

Soyut olabilecek bir temel sınıf şablonu yazarak çalışma zamanı şablonları arasında içerik paylaşabilirsiniz. inherits Başka bir çalışma zamanı şablon sınıfına <@#template#> başvurmak için yönergesinin parametresini kullanın.

Devralma deseni: Temel Yöntemlerdeki Parçalar

Aşağıdaki örnekte kullanılan desende aşağıdaki noktalara dikkat edin:

  • Temel sınıf, SharedFragments sınıf özellik blokları <#+ ... #>içindeki yöntemleri tanımlar.

  • Temel sınıf boş metin içermez. Bunun yerine, tüm metin blokları sınıf özellik yöntemleri içinde gerçekleşir.

  • Türetilmiş sınıf içinde SharedFragmentstanımlanan yöntemleri çağırır.

  • Uygulama türetilmiş sınıfın yöntemini çağırır TextTransform() , ancak temel sınıfını SharedFragmentsdönüştürmez.

  • Hem temel hem de türetilmiş sınıflar çalışma zamanı metin şablonlarıdır; yani, Özel Araç özelliği TextTemplatingFilePreprocessor olarak ayarlanır.

SharedFragments.tt:

<#@ template language="C#" #>
<#+
protected void SharedText(int n)
{
#>
   Shared Text <#= n #>
<#+
}
// Insert more methods here if required.
#>

MyTextTemplate1.tt:

<#@ template language="C#" inherits="SharedFragments" #>
begin 1
   <# SharedText(2); #>
end 1

MyProgram.cs:

...
MyTextTemplate1 t1  = new MyTextTemplate1();
string result = t1.TransformText();
Console.WriteLine(result);

Sonuçta elde edilen çıkış:

begin 1
    Shared Text 2
end 1

Devralma Deseni: Temel Gövdedeki Metin

Şablon devralmayı kullanmaya ilişkin bu alternatif yaklaşımda, metnin büyük bölümü temel şablonda tanımlanır. Türetilmiş şablonlar, temel içeriğe uygun veri ve metin parçaları sağlar.

AbstractBaseTemplate1.tt:

<#@ template language="C#" #>

Here is the description for this derived template:
  <#= this.Description #>

Here is the fragment specific to this derived template:
<#
  this.PushIndent("  ");
  SpecificFragment(42);
  this.PopIndent();
#>
End of common template.
<#+
  // State set by derived class before calling TextTransform:
  protected string Description = "";
  // 'abstract' method to be defined in derived classes:
  protected virtual void SpecificFragment(int n) { }
#>

DerivedTemplate1.tt:

<#@ template language="C#" inherits="AbstractBaseTemplate1" #>
<#
  // Set the base template properties:
  base.Description = "Description for this derived class";

  // Run the base template:
  base.TransformText();

#>
End material for DerivedTemplate1.

<#+
// Provide a fragment specific to this derived template:

protected override void SpecificFragment(int n)
{
#>
   Specific to DerivedTemplate1 : <#= n #>
<#+
}
#>

Uygulama kodu:

...
DerivedTemplate1 t1 = new DerivedTemplate1();
string result = t1.TransformText();
Console.WriteLine(result);

Sonuçta elde edilen çıkış:

Here is the description for this derived template:
  Description for this derived class

Here is the fragment specific to this derived template:
     Specific to DerivedTemplate1 : 42
End of common template.
End material for DerivedTemplate1.

Tasarım zamanı şablonları: Uygulamanızın bir parçası haline gelen kod oluşturmak için bir şablon kullanmak istiyorsanız bkz . T4 Metin Şablonlarını kullanarak Tasarım Zamanı Kodu Oluşturma.

Çalışma zamanı şablonları, şablonların ve içeriklerinin derleme zamanında belirlendiği herhangi bir uygulamada kullanılabilir. Ancak çalışma zamanında değişen şablonlardan metin oluşturan bir Visual Studio uzantısı yazmak istiyorsanız bkz . VS Uzantısında Metin Dönüştürmeyi Çağırma.