Aracılığıyla paylaş


T4 Metin Şablonu Yazma

Metin şablonu, ondan oluşturulacak metni içerir. Örneğin, web sayfası oluşturan bir şablon "<html>..." içerir ve html sayfasının diğer tüm standart bölümleri. Şablona eklenenler , program kodunun parçaları olan denetim bloklarıdır. Denetim blokları farklı değerler sağlar ve metnin bölümlerinin koşullu ve tekrarlı olmasını sağlar.

Oluşturulan dosyanın prototipiyle başlayıp sonucu değişen denetim bloklarını artımlı olarak ekleyebildiğiniz için bu yapı şablonun geliştirilmesini kolaylaştırır.

Metin şablonları aşağıdaki bölümlerden oluşur:

  • Yönergeler - şablonun nasıl işlendiğini denetleen öğeler.

  • Metin blokları - doğrudan çıkışa kopyalanan içerik.

  • Denetim blokları - metne değişken değerleri ekleyen ve metnin koşullu veya yinelenen bölümlerini denetleen program kodu.

Bu konudaki örnekleri denemek için, T4 Metin Şablonlarını kullanarak Tasarım Zamanı Kodu Oluşturma bölümünde açıklandığı gibi bunları bir şablon dosyasına kopyalayın. Şablon dosyasını düzenledikten sonra kaydedin ve çıkış .txt dosyasını inceleyin.

Yönergeler

Metin şablonu yönergeleri, dönüştürme kodunun ve çıkış dosyasının nasıl oluşturulacağı hakkında metin şablon altyapısına genel yönergeler sağlar.

Örneğin, aşağıdaki yönerge çıkış dosyasının bir .txt uzantısına sahip olması gerektiğini belirtir:

<#@ output extension=".txt" #>

Yönergeler hakkında daha fazla bilgi için bkz . T4 Metin Şablonu Yönergeleri.

Metin blokları

Metin bloğu, çıktı dosyasına doğrudan metin ekler. Metin blokları için özel biçimlendirme yoktur. Örneğin, aşağıdaki metin şablonu "Hello" sözcüğünü içeren bir metin dosyası oluşturur:

<#@ output extension=".txt" #>
Hello

Denetim blokları

Denetim blokları, şablonları dönüştürmek için kullanılan program kodunun bölümleridir. Varsayılan dil C#'dir, ancak Visual Basic'i kullanmak için bu yönergeyi dosyanın başına yazabilirsiniz:

<#@ template language="VB" #>

Denetim bloklarında kodu yazdığınız dil, oluşturulan metnin diliyle ilişkili değildir.

Standart denetim blokları

Standart denetim bloğu, program kodunun çıkış dosyasının bir bölümünü oluşturan bölümüdür.

Şablon dosyasında istediğiniz sayıda metin bloğu ve standart denetim bloğu birleştirebilirsiniz. Ancak, bir denetim bloğunu başka bir denetim bloğunun içine yerleştiremezsiniz. Her standart denetim bloğu sembolleri <# ... #>ile sınırlandırılır.

Örneğin, aşağıdaki denetim bloğu ve metin bloğu çıkış dosyasının "0, 1, 2, 3, 4 Hello!" satırını içermesine neden olur:

<#
    for(int i = 0; i < 4; i++)
    {
        Write(i + ", ");
    }
    Write("4");
#> Hello!

Açık Write() deyimleri kullanmak yerine metin ve kodu birbirine ekleyebilirsiniz. Aşağıdaki örnekte "Hello!" dört kez yazdırılır:

<#
    for(int i = 0; i < 4; i++)
    {
#>
Hello!
<#
    }
#>

Kodda deyimine izin verilen her yere metin Write(); bloğu ekleyebilirsiniz.

Not

Döngü veya koşullu gibi bir bileşik deyimin içine bir metin bloğu eklediğinizde, metin bloğunu içermek için her zaman {...} ayraçlarını kullanın.

İfade denetim blokları

İfade denetim bloğu bir ifadeyi değerlendirir ve dizeye dönüştürür. Bu, çıkış dosyasına eklenir.

İfade denetim blokları simgelerle sınırlandırılır <#= ... #>

Örneğin, aşağıdaki denetim bloğu çıkış dosyasının "5" içermesine neden olur:

<#= 2 + 3 #>

Açılış simgesinde üç karakter "<#=" olduğuna dikkat edin.

İfade, kapsamdaki herhangi bir değişkeni içerebilir. Örneğin, bu blok sayı içeren satırları yazdırır:

<#@ output extension=".txt" #>
<#
    for(int i = 0; i < 4; i++)
    {
#>
This is hello number <#= i+1 #>: Hello!
<#
    }
#>

Sınıf özelliği denetim blokları

Sınıf özellik denetim bloğu, ana dönüşüme dahil edilmemesi gereken özellikleri, yöntemleri veya diğer kodları tanımlar. Sınıf özellik blokları genellikle yardımcı işlevler için kullanılır. Genellikle, sınıf özellik blokları birden fazla metin şablonu tarafından eklenebilmeleri için ayrı dosyalara yerleştirilir.

Sınıf özelliği denetim blokları semboller tarafından sınırlandırılır <#+ ... #>

Örneğin, aşağıdaki şablon dosyası bir yöntem bildirir ve kullanır:

<#@ output extension=".txt" #>
Squares:
<#
    for(int i = 0; i < 4; i++)
    {
#>
    The square of <#= i #> is <#= Square(i+1) #>.
<#
    }
#>
That is the end of the list.
<#+   // Start of class feature block
private int Square(int i)
{
    return i*i;
}
#>

Sınıf özellikleri, yazıldıkları dosyanın sonuna yerleştirilmelidir. Ancak, yönergenin ardından standart bloklar ve metinler gelse include bile sınıf özelliği içeren bir dosya oluşturabilirsiniz<#@include#>.

Denetim blokları hakkında daha fazla bilgi için bkz . Metin Şablonu Denetim Blokları.

Sınıf özellik blokları metin blokları içerebilir

Metin oluşturan bir yöntem yazabilirsiniz. Örneğin:

List of Squares:
<#
   for(int i = 0; i < 4; i++)
   {  WriteSquareLine(i); }
#>
End of list.
<#+   // Class feature block
private void WriteSquareLine(int i)
{
#>
   The square of <#= i #> is <#= i*i #>.
<#+
}
#>

Birden fazla şablon tarafından eklenebilen ayrı bir dosyaya metin oluşturan bir yöntem yerleştirmek özellikle yararlıdır.

Dış tanımları kullanma

Bütünleştirilmiş kodlar

Şablonunuzun kod blokları, System.dll gibi en sık kullanılan .NET derlemelerini tanımlayan türleri kullanabilir. Ayrıca, diğer .NET derlemelerine veya kendi derlemelerinize başvurabilirsiniz. Bir yol adı veya derlemenin tanımlayıcı adını sağlayabilirsiniz:

<#@ assembly name="System.Xml" #>

Mutlak yol adları veya yol adında standart makro adları kullanmanız gerekir. Örneğin:

<#@ assembly name="$(SolutionDir)library\MyAssembly.dll" #>

Derleme yönergesinin önceden işlenmiş bir metin şablonunda hiçbir etkisi yoktur.

Daha fazla bilgi için bkz . T4 Derleme Yönergesi.

Ad Alanları

İçeri aktarma yönergesi, C# içindeki yan tümcesi veya Visual Basic'teki yan tümcesi imports ile aynıdırusing. Tam ad kullanmadan kodunuzdaki türlere başvurmanıza olanak tanır:

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

İstediğiniz kadar assembly ve import yönergesi kullanabilirsiniz. Bunları metin ve denetim bloklarının önüne yerleştirmelisiniz.

Daha fazla bilgi için bkz . T4 İçeri Aktarma Yönergesi.

Kod ve metin ekleme

yönergesi include başka bir şablon dosyasından metin ekler. Örneğin, bu yönerge içeriğini test.txtekler.

<#@ include file="c:\test.txt" #>

Eklenen içerik ekleyen metin şablonunun hemen hemen parçasıymış gibi işlenir. Bununla birlikte, include yönergesi sıradan metin ve standart denetim blokları tarafından izlense bile sınıf özellik bloğu <#+...#> içeren bir dosya ekleyebilirsiniz.

Daha fazla bilgi için bkz . T4 Include Yönergesi.

Yardımcı program yöntemleri

Bir denetim bloğunda her zaman kullanabileceğiniz çeşitli Write() yöntemler vardır. Bunlar, çıktıyı girintili duruma getirmeye ve hataları raporlamanıza yardımcı olacak yöntemler içerir.

Kendi yardımcı program yöntemleri kümenizi de yazabilirsiniz.

Daha fazla bilgi için bkz . Metin Şablonu Yardımcı Programı Yöntemleri.

Verileri ve Modelleri Dönüştürme

Metin şablonu için en kullanışlı uygulama, model, veritabanı veya veri dosyası gibi bir kaynağın içeriğine dayalı malzeme oluşturmaktır. Şablonunuz verileri ayıklar ve yeniden biçimlendirer. Şablon koleksiyonu, böyle bir kaynağı birden çok dosyaya dönüştürebilir.

Kaynak dosyayı okumak için birkaç yaklaşım vardır.

Metin şablonundaki bir dosyayı okuyun. Bu, şablona veri almak için en basit yoldur:

<#@ import namespace="System.IO" #>
<# string fileContent = File.ReadAllText(@"C:\myData.txt"); ...

Dosyayı gezinilebilir model olarak yükleyin. Daha güçlü bir yöntem, metin şablonu kodunuzun gezinebileceği verileri model olarak okumaktır. Örneğin, bir XML dosyasını yükleyebilir ve XPath ifadeleriyle bu dosyada gezinebilirsiniz. Xml verilerini okuyabileceğiniz bir sınıf kümesi oluşturmak için xsd.exe dosyasını da kullanabilirsiniz.

Model dosyasını diyagram veya formda düzenleyin. Etki Alanına Özgü Dil Araçları, bir modeli diyagram veya Windows formu olarak düzenlemenize olanak sağlayan araçlar sağlar. Bu, modeli oluşturulan uygulamanın kullanıcıları ile tartışmayı kolaylaştırır. Etki Alanına Özgü Dil Araçları, modelin yapısını yansıtan kesin olarak belirlenmiş bir sınıf kümesi de oluşturur. Daha fazla bilgi için bkz . Etki Alanına Özgü Bir Dilden Kod Oluşturma.

Tasarım zamanı şablonlarındaki göreli dosya yolları

Tasarım zamanı metin şablonunda, metin şablonuna göre bir konumdaki bir dosyaya başvurmak istiyorsanız kullanınthis.Host.ResolvePath(). Ayrıca yönergesinde template ayarlamanız hostspecific="true" gerekir:

<#@ template hostspecific="true" language="C#" #>
<#@ output extension=".txt" #>
<#@ import namespace="System.IO" #>
<#
 // Find a path within the same project as the text template:
 string myFile = File.ReadAllText(this.Host.ResolvePath("MyFile.txt"));
#>
Content of MyFile.txt is:
<#= myFile #>

Konak tarafından sağlanan diğer hizmetleri de edinebilirsiniz. Daha fazla bilgi için bkz . Şablondan Visual Studio'ya veya diğer Konaklara Erişme.

Tasarım Zamanı Metin Şablonları ayrı bir AppDomain içinde çalışır

Tasarım zamanı metin şablonunun ana uygulamadan ayrı bir AppDomain içinde çalıştığını unutmayın. Çoğu durumda bu önemli değildir, ancak bazı karmaşık durumlarda kısıtlamaları keşfedebilirsiniz. Örneğin, şablonun içinde veya dışında ayrı bir hizmetten veri geçirmek istiyorsanız, hizmetin seri hale getirilebilir bir API sağlaması gerekir.

(Bu, kodunuzun geri kalanıyla birlikte derlenmiş kod sağlayan bir çalışma zamanı metin şablonu için geçerli değildir.)

Şablonları Düzenleme

Özelleştirilmiş metin şablonu düzenleyicileri Uzantı Yöneticisi Çevrimiçi Galerisi'nden indirilebilir. Araçlar menüsünde Uzantı Yöneticisi'ne tıklayın. Çevrimiçi Galeri'ye tıklayın ve arama aracını kullanın.