C# Edmx ve Text for Template (TT) Dosyaları ile Otomatik Kod Oluşturma

 

T4 Text Template Giriş

T4 Text Template ile dinamik olarak nasıl dosya oluşturabileceğimizi göreceğiz. Aslında EntityFramework’den aşina olduğumuz ama dosyalarına çoğu zaman müdahale etmediğimiz *.tt uzantılı dosyalar birer T4 metin şablonudur.

T4 Text Template

T4 Text Template Nasıl Oluşturulurdan önce çok basit şekilde .tt uzantılı dosya içerisindeki yazılan kodlar nasıl sonuca ulaşıyor 3 aşamada görelim bir şema üzerinde.

T4 Text Template Transformation Process

Yeni T4 Text Template Oluşturma

Hemen T4 anlatımına T4 Text Template nasıl oluşturabiliriz ile başlayalım projeye Projenize Solution Explorer penceresinden sağ tuş yapıp Add menüsü altındaki Add New Item‘a tıklayın çıkan şablon listesinden Text Template‘i seçin ve projenize ekleyin. Projenize ekledikten sonra .tt uzantılı bir dosyanın oluştuğunuz göreceksiniz. Eğer herhangi bir isim değişikliği yapmadıysanız TextTemplate1.tt adlı bir dosya oluşacaktır.

Dosya oluştuktan sonra alttakine benzer bir kod ile karşılaşacaksınız ve <#@ …. #> bu şekildeki tanımlamaların her bir satırına direktif diyoruz. Direktifleri ayrıntılı olarak farklı bir makalede ele alacağız.

TT dosyası nasıl oluşturulur ?

Proje adına sağ tıklanır.
















Add > New Item adımı izlenir.


















Açılan ekranda Text Template  seçilir ve Template ismi girilir. Ardınan Add butonuna basılır.

















Solution Explorer penceresinde oluşan .tt uzantılı ismini verdiğimiz Text For Template öğesine çift tıklanır. Otomatik gelen kod bloğunda output alanı bize çıkartmasını istediğimiz dosya formatıdır. Bu örneğimizde class kullanacağımız için .txt olan alanı .cs olarak değiştiriyoruz. 
 
Kod

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".cs" #>//Burada normalde txt yazar fakat biz cs yani class çıkartmasını istediğimiz için çıktı tipini .cs yapıyoruz.



Aşağıdaki kod bloğunu yazara bir değişkeni 20 defa yazmasını sağlayacağız.


public class Sayilar
{
    <#for(int i=1;i<=20;i++)
    {#>
        public int sayi<#=i#> {get;set;} //burada diyez(#) işaretleri C# programlama kodunu açıklamadan ayırmak için kullanılır.
    <#}#>

}



Kaydet ya da Ctrl + S butonuna bastığımızda .tt uzantılı dosyamızın altında .cs uzantılı dosyamız oluşacaktır. Çift tıkladığımızda oluşan kodları ve değişkenleri göreceğiz.

















Gördüğünüz gibi değişkenler bu şekilde olacaktır. Diğer örneklere bakalım:

Standart kontrol blokları – Standard control blocks


Şimdi for döngüsü ile 10 defa döngü değeri olan i değişkeninin her dönüşte karesini alacak metni Generator ile .txt uzantılı dosyaya yazılacak. Kodlarımızı <# … #> Standart Kontrol  Blokları arasında kodlarımızı yazacağız farklı birkaç blok tanımları daha var sırasıyla bunlarıda göreceğiz. Şimdi standrt kontrol blokları arasında yazdığımız örneği inceleyelim.

Kod(TextTemplate1.tt)

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".cs" #>//Burada normalde txt yazar fakat biz cs yani class çıkartmasını istediğimiz için çıktı tipini .cs yapıyoruz.

<#int top = 10;  

for (int i = 0; i<=top; i++)   
{ 
#>  
   <#= i #>'in karesi <#= i*i #>.  
<# 
} 
#>

Çıktı:







Sınıf özelliği kontrol blokları – Class feature control blocks

Sınıf özelliği kontrol blokları tanımlaması <#+ … #> şeklinde yapılmaktadır ve bu bloklar içerisine özellik(property) ve metod tanımlamaları yapılır tt uzantılı dosya içerisinde kullanılabilir kısacası çıktı oluşturmak için yardımcı metodlar ve özellikler(properties) oluşturabiliriz ve bunları kullanabiliriz hemen bu kontrol bloğu ile ilgili bir örnek yapıp çıktıyı kontrol edelim ve bilgimizi pekiştirelim.

Kod(TextTemplate2.tt)

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".cs" #>//Burada normalde txt yazar fakat biz cs yani class çıkartmasını istediğimiz için çıktı tipini .cs yapıyoruz.

Kareler:
<#
    for (int i = 0; i < 4; i++)
    {
#>
       <#= i + 1 #> sayısının karesi <#= Square(i+1) #> 
<#
    }
#>
Liste bitişi.
<#+ // Sınıf özelliği bloğu
    int Square(int i)
    {
        return i*i;
    }
#>

Çıktı










Detaylı ve uygulamalı bilgiler için mail yada iletişim formundan iletişime geçebilirsiniz :)

Yorumlar

Bu blogdaki popüler yayınlar

Yazıcıda Bekleyen Belgeleri Hızlıca Temizleme

C# ile SQL Veritabanı Yedeğini Alma

SQL SERVER'da sa ve diğer kullanıcıları aktif etme