PDA

View Full Version : Code Generator و T4 Text Template



pooria2c
یک شنبه 13 مرداد 1392, 16:07 عصر
Code Generation and T4 Text Template :
با اجازه از همه اساتید محترم، می خواستم یه بحث خیلی مهم رو توی برنامه نویسی بگم، که واسه راحتی کدنویسی در پروژه های آینده هر برنامه نویسی نیازه!!!!
اول از همه می خوام هدف از این تاپیک رو بگم،
شما EF رو در نظر بگیرید که برای تمامی جداول موجود در پایگاه داده کلاس هایی رو ایجاد می کنه POCO، تمامی فیلد های اون و تولید می کنه، حالا می خواییم کاری کنیم که خودمون تعیین کنیم چی رو تولید کنیم، اصلاً چه فایلی رو تولید کنیم، مثلاً می تونیم تعیین کنیم که علاوه بر فیلدهای عضو یک سری تابع هم برای ما تولید کنه!!!
پس به طور کلی هدف از این بخش، تولید کدهای خودکار می باشد، که با استفاده از امکانات ویژوال استادیو می تونیم این کار و انجام بدیم (مثلاً: به جای اینکه وقت خودمون و صرف نوشتن کدهای اضافی در لایه تجاری کنیم، با استفاده از یک Code Generator می آییم واسه تمامی کلاس های موجود تابع های تجاری خودمون و تعریف می کنیم.)
در ویژوال استادیو یک T4 Text Template ترکیبی از بلاک های متنی و کنترل های منطقی می باشد که می تونه یک فایل متنی رو تولید کنه. کنترل منطقی بخش هایی از کد برنامه ویژوال سی شارپ یا ویژوال بیسیک هستند، فایل خروجی می تواند به صورت متنی یا هر نوع فایل دیگری باشد، مثل یک فایل HTML، یک فایل منابع یا سورس منبع برنامه به هر زبانی باشد.
به طور کلی 2 نوع T4 Text Template وجود دارد:
1. Run time T4 text templates
با استفاده از این قالب می تونیم فقط متن های معمولی رو ایجاد کنیم، مثلاً :


<html><body>
The date and time now is: <#= DateTime.Now #>
</body></html>






توجه داشته باشید که خروجی هم مثل کد بالا می باشد، و شباهت خروجی با این کد به شما در ویرایش کد کمک خواهد کرد و هم طور می توان در این کد از قطعه کد های سی شارپ و یا ویژوال بیسیک استفاده کرد، مثلاً از حلقه برای تکرار قسمتی مثلاً سطر های جداول و یا شرط و دستورات دیگر استفاده کرد.
برای تولید فایل خروجی هم از دستور زیر استفاده می کنیم :
string context = new MyTextTemplate().TransformText();

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



خوب حالا مراحل اضافه کردن یک فایل Run Time t4 text templates به شرح زیر می باشد:
Add New Item > Runtime text template

حالا یه فایلی شبیه به فایل زیر می بینید:
<#@ template language="C#‎" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>

حالا شما تصور کنید که به انتهای این فایل یک سری دستوراتی رو اضافه کردیم، مثل زیر :
<#@ 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>T
est value <#= i * i #> </td> </tr>
<# } #> </table>This report is Company Confidential.</body></html>
خوب حالا کافیه که توی برنامه ازش استفاده کنیم، (مثل یه برنامه کنسول سی شارپ).
Page page = new Page();
String pageContent = page.TransformText();
System.Console.WriteLine(pageContent);

pooria2c
یک شنبه 13 مرداد 1392, 17:02 عصر
1. Design time T4 text templates

با استفاده از این الگو می تونید فایل های مجزای دیگری را ایجاد نمایید، مثلاً از فایل های متنی ساده گرفته تا فایل سی شارپ و ...، و اینکه این نکته رو باید توجه داشته باشید که از یک منبع داده ای مثل XML و یا پایگاه داده )فرقی نمی کنه که چی باشه) باید برای تولید این نوع تمپلیت ها استفاده کرد.

- مراحل ایجاد این فایل:

1. ابتدا یک پروژه ایجاد کنید( مثلاً همون کنسول باشه خوبه).

2. سپس از منوی زیر یک فایل به پروژه خودتون اضافه کنید.
Add New Item > Text Template

بعدش یه نامی رو واسه این فایلتون که پسوندشم .tt هست انتخاب کنید.

با خروجی مثل خروجی زیر واستون باز بشه.
<#@ template hostspecific="false" language="C#‎" #><#@ output extension=".txt" #>
خوب حالا اگر شما متنی رو مثلاً Hello, Wolrd! رو به انتهای این پنجره اضافه کنید، می توانید یه فایل .txt ببینید.(دقت کنید که خروجی های این فایل بلافاصله بعد از ذخیره کردنشون قابل دسترسی هستند.)
<#@ template hostspecific="false" language="C#‎" #><#@ output extension=".txt" #>Hello, World!


حالا یه مثال خیلی ساده !


با استفاده از ویژوال استادیو یه برنامه ایجاد کنید و یه فایل Text Template به روشی که گفته بودم به برنامه خودتون اضافه کنید و دستوراتش و مثل زیر تغییر بدین!
<#@ template hostspecific="false" language="C#‎" #><#@ output extension=".txt" #><#int top = 10; for (int i = 0; i<=top; i++) { #>The square of <#= i #> is <#= i*i #><# } #>
همون طوری که مشاهده می کنین، توی فایل .txt ایجاد شده خروجی زیر تولید میشه!
The square of 0 is 0
The square of 1 is 1
The square of 2 is 4
The square of 3 is 9
The square of 4 is 16
The square of 5 is 25
The square of 6 is 36
The square of 7 is 49
The square of 8 is 64
The square of 9 is 81
The square of 10 is 100

خوب حالا مثال بعدی درباره ایجاد کلاس هایی برای مقاصد خودمونه!!

حالا کد مثال قبل رو به صورت زیر تغییر بدید!!

<#@ template debug="false" hostspecific="false" language="C#‎" #>
<#@ output extension=".cs" #>
<# var properties = new string [] {"P1", "P2", "P3"}; #>
class MyGeneratedClass {
<# foreach (string propertyName in properties) { #>
private int <#= propertyName #> = 0;<# } #>}

دقت کنید که دیگه پسوند .txt نیست و برای ایجاد کلاس داریم از اون استفاده می کنیم!!

و خروجی به صورت زیره!

class MyGeneratedClass
{
private int P1 = 0;
private int P2 = 0;
private int P3 = 0;}