T4 Template چیست؟

T4 Template چیست؟

در این مقاله قصد داریم بگوییم که Text Template Transformation Toolkit  یا (T4) template چیست و چگونه میتوان آنرا شخصی سازی کرد.

 

(T4) template چیست؟

بطور ساده و مختصر، زمانی که در یک پروژه MVC شما با استفاده از scaffold یک کنترلر و یا یک View  را به پروژه اضافه میکنید درواقع دارید از T4 Template ها کمک میگیرید. T4 Template قالب هایی هستند که باعث میشوند کدهای c# یا vb  بصورت اتومانیک تولید شوند و صفحاتی ایجاد گردند.

در زمان استفاده  از گزینه Add Controller در قسمت scaffold options لیست کشویی تحت عنوان Template  وجود دارد که این لیست همان لیست T4 Template هاست.

فرض کنید در مدل پروژه کلاسی داریم به نام ListEmployee.cs که به شکل زیر است

  1. using System.ComponentModel.DataAnnotations.Schema;  
  2. using System.Data.Entity;  
  3.   
  4. namespace mvcDemo.Models  
  5. {  
  6.     [Table("Employee_Master")]  
  7.     public class ListEmployee  
  8.     {  
  9.         public int Id { getset; }  
  10.         public string Name { getset; }  
  11.         public string Email { getset; }  
  12.     }  
  13.   
  14.     public class ListEmployeeContext : DbContext  
  15.     {  
  16.       public  DbSet<ListEmployee> listEmployee { getset; }  
  17.     }  
  18. }  

حال اگر کنترلی را همانند تصویر زیر به برنامه اضافه کنیم خواهیم دید که متدهای  Index,Detail,Create,Edit و Delete و پوشه های مربوط به View های  آنها توسط خود ویژوال استدیو ایجاد میشود

این همان فراخوانی T4 Template  است.

شما میتواند فایل های مربوط به T4 Template ها در مسیرهای زیر پیدا کنید

مسیر T4 template  برای Viewها

C:\Program Files\Microsoft Visual Studio 11.0\Common7\IDE\ItemTemplates\CSharp\Web\MVC 4\CodeTemplates\AddView\CSHTML

و مسیر T4 Template برای Controllerها

C:\Program Files\Microsoft Visual Studio 11.0\Common7\IDE\ItemTemplates\CSharp\Web\MVC 4\CodeTemplates\AddController.

البته به این نکته توجه داشته باشدی که این مسیرها ممکن است با توجه به نسخه VisualStudio و نوع پروژه شما کمی متفاوت باشد

حالا بیایید تا T4 Template ی برای خودمان ایجاد کنیم و آنرا به لیست قالب ها اضافه کنیم تا بتوانیم آنرا در یک پروژه استفاده نماییم.

ساده ترین راه برای ایجاد یک T4 Template سفارشی این است که یکی از قالب های موجود را از مسیرهای پیشفرض کپی گرفته و آنرا ویرایش کنیم. اما قبل از شروع بهرت است با ساختار فایل کمی بیشتر آشنا شویم.

زمانی که یک فایل T4 Template را باز میکنید اولین چیزی که میبینید کدهای مشابه کد زیر است

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

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

 

Language مشخص کنند این است که این قالب برای چه زبانی قرار است استفاده شود.

HostSpecific =”True”  : اگر مقدار این خاصیت به true مقداردهی شده باشد شما میتواند از داخل قالب به خاصیتی به نام Host دسترسی داشته باشید این ویژگی به موجودیتی از نوع Host Engine اشاره دارد.

تگ Output extension هم مشخص کننده ایت است که فایل جدید ایجاد شده دارای چه پسوندی باشد.

بیایید کمی در فایل دقیق تر شویم.

فایل های T4 دارای چهار نوع بلاک هستند :

Expression block

در این بلاک های از تگ <#= expression #> برای نوشتن های C# و Vb استفاده میشود اما نباید از سیمی کالن در انتهای دستورات استفاده کرد.

Statement block

در این بلاک های از تگ <# code…. #> برای تعریف هرنوع کد سی شارپ یا VB استفاده میشود مانند تعریف متغیرها، مقداردهی اولیه ایجاد حلقه ها و...

در این بلاک باید در انتهای دستورات سیمی کالن گذاشت.

Class feature block

در این بلاک از تگ <#+ code… #> برای تعریف متدها، کلاس ها و ثابت ها استفاده میشود که که میتواند انها در هر بلاکی در فایل T4 فراخوانی کرد. برای مثال شما میتوانید تابعی را تعریف کنید که عملیات محاسباتی اناجم میدهد و خروجی آن از نوع Bool است و سپس ان را در UI بگار بگیرید.

در زیر کد یک صفحه واقعی را میبینید که بطور داینامیک میتواند صفحه ای بر اساس مدل برنامه تولید کند.

میخواهیم همین قالب را جایگزین قالب پیشفرض کنیم و از آن در برنامه استفاده کنیم.

محتوای این فایل با محتوای فایل create.tt جایگزین کنید

کد بالا بررسی میکند که ویژگی موجود در مدل اگر دارای گلید حارجی است یک لیست کشویی ایجاد میکند در غیر این صورت یک Lable ایجاد میشود(در وضعیت ویرایش input ایجاد میکند).

خب حالا بیایید تا T4 Template  مخصوص خودمان را ایجاد کنیم.

  1. یک پروژه جدید MVC در Visual Studio ایجاد کنید
  2. کلاس مدل را برای Person  و  Designation مطابق کدهای زیر ایجاد کنید.
  1. public class Person     
  2.     {
  3.         public long PersonId { set; get; }
  4.         public String FirstName { set; get; }
  5.         public String LastName { set; get; }
  6.         public String EmailAddress { set; get; }
  7.         public String Phone { set; get; }
  8.         public long DesignationId { set; get; }
  9.         public virtual Designation Designation { set; get; }
  10.  
  11.     }
  12.  
  13.     public class Designation
  14.     {
  15.         public long DesignationId { set; get; }
  16.         public String DesignationName { set; get; }
  17.         public virtual ICollection<Person> Persons { get; set; }
  18.  
  19.     }

 

*کدهای زیر بر اساس رویکرد FirstCode  با استفاده از EntityFramWork می باشد.

      3. حالا کلاس DbContext را میسازیم

public class DBContext : System.Data.Entity.DbContext, IDisposable

{

     public DbSet<Person> Persons { get; set; }

     public DbSet<Designation> Designations { set; get; }

}

 

 

حالا کنترلی جدید به برنامه اضافه میکنیم

 

اکر فایل Create.cshtml را باز کنید لیست کشویی که برای فیلد   Destination ایجاد شده است را میتوانید ببینید. این همان جایی است کلید خارجی را در قالب چک کردیم .

حالا بیایید بجای لیست کشویی از ListBox استفاده کنیم.

به فایل قالب برمیگردیم و تغییرات زیر را در جایی که Dropdown ایجاد میکردیم اعمال میکنیم

 

حالا کنترلر قبلی را حذف میکنیم و مجدد انرا اضافه میکینم. میبینیم خروجی کار اینبار یک ListBox است.

این مثال ساده ای بود که نشان می دهد توسعه دهندگان چگونه می توانند الگوهای موجود را بر اساس نیاز خود تغییر دهند و زمان توسعه را کاهش دهند.

منابع: https://dzone.com/ , https://www.c-sharpcorner.com/

مرتضی جنگجو

برنامه نویس fullstack با بیش از 14 سال سابقه کار و همکاری در توسعه و پیاده سازی نرم افزارهای تحت وب با تکنولوژی Net. در شرکتهای بزرگ ایرانی، هلندی، فنلاندی و ترکیه

شبکه های اجتماعی نویسنده

دیدگاه کاربران