中文字幕日韩一区二区_国产一区二区av_国产毛片av_久久久久国产一区_色婷婷电影_国产一区二区精品

創(chuàng)建代碼生成器可以很簡單:如何通過T4模板生成代碼?[下篇]

  在《上篇》中我們通過T4模板為我們指定的數(shù)據表成功生成了我們需要的用于添加、修改和刪除操作的存儲過程。但是這是一種基于單個文件的解決方案,即我們必須為每一個生成的存儲過程建立一個模板。如果我們提供一種基于多文件的代碼生成方式,將會為編程人員帶來極大的便利。借助于T4 ToolBox這個開源工具箱,多文件的SQL Generator的實現(xiàn)變得異常簡單。

  一、多文件代碼生成器會帶來多大的便利?

  我們先來直觀的感受一下較之《上篇》提供的單一文件的代碼生成器,基于多文件的代碼生成解決方案會為開發(fā)人員帶來多大的便利。 同樣對于《上篇》創(chuàng)建的數(shù)據表T_PRODUCT,之前我們?yōu)榱松扇齻€不同的存儲過程,我們不得已需要創(chuàng)建3個不同的T4模板文件。實際上我們更需要的方式只需要創(chuàng)建一個T4模板,讓我們的SQL Generator自動為我們生成3個包含相應存儲過程的.sql附屬文件,如左圖所示(點擊看大圖)。

  有的時候,基于單個數(shù)據表的存儲過程生成方式我們依然覺得不方便。如果我們能夠在T4模板文件中指定的數(shù)據表的列表,讓我們的SQL Generator為列表的每一個數(shù)據表都生成CUD三個存儲過程,這樣的方式更加具有吸引力。如右圖所示(點擊看大圖),一個訂單模塊包含兩個具有主子關系的兩張表(T_ORDER和T_ORDER_DETAIL),現(xiàn)在我們在一個T4模板中指定這兩個表明,通過SQL Generator可以幫助我們生成6個包含存儲過程的.sql附屬文件。

  甚至有的時候我們連數(shù)據表列表都無需指定,讓SQL Generator為所有的表都生成相應的存儲過程。我的例子中沒有提供這樣的功能,但是實現(xiàn)自來不會存在任何問題。

  二、創(chuàng)建自定義的Generator

  在《上篇》中我創(chuàng)建了一個抽象的ProcedureTemplate類,以及三個基于生成CUD存儲過程的具體ProcedureTemplate: InsertProcedureTemplate、UpdateProcedureTemplate和DeleteProcedureTemplate。它們都將直接服務于我們今天將要提供的基于多文件的SQL Generator。

  在《上篇》中,這四個Template分別定義在4個不同的TT文件中,3個具體的ProcedureTemplate通過<#@include>指令將抽象ProcedureTemplate模板文件包含過來。由于我們將要創(chuàng)建的T4模板將會使用到這四個類,如果我們用四個<#@include>指令將四個TT文件包含過來,由于T4引擎將會導致對ProcedureTemplate的4次包含,最好將會導致變異問題。個人覺得這應該算是T4引擎解析包含關系的一個局限性,為了解決這個問題我們不得不抽象的ProcedureTemplate和三個具體的ProcedureTemplate都合并成一個TT文件。

  T4 ToolBox為類庫中為了提供了一個抽象的T4Toolbox.Generator類用于實現(xiàn)多文件的代碼生成。為此我們創(chuàng)建一個TT模板文件,定義了如下一個繼承自該類的ProcedureGenerator。ProcedureGenerator的核心是通過屬性Templates定義的類型為IEnumerable<ProcedureTemplate>的ProcedureTemplate列表,這個列表在存儲過程中進行初始化。而對于ProcedureGenerator的構造函數(shù),處理定義了一個表示數(shù)據庫連接字符串的databaseName的參數(shù)外,要以數(shù)組參數(shù)的形式指定了生成的存儲過程基于的數(shù)據表名的列表。

<#@ import namespace="System.Collections.Generic" #>
<#@ include file="ProcedureTemplate.tt" #>
<#@ include file="T4Toolbox.tt" #>
<#+
public class ProcedureGenerator : Generator
{
public IEnumerable<ProcedureTemplate> Templates{get; private set;}

public ProcedureGenerator(string databaseName, params string[] tableNames)
{
if(null == tableNames || tableNames.Length == 0)
{
throw new ArgumentNullException("tableNames");
}

this.Templates = InitlizeTemplates(databaseName,tableNames);
}

private IEnumerable<ProcedureTemplate> InitlizeTemplates(string databaseName, string[] tableNames)
{
foreach(string tableName in tableNames)
{
yield return new InsertProcedureTemplate(databaseName, tableName);
yield return new UpdateProcedureTemplate(databaseName, tableName);
yield return new DeleteProcedureTemplate(databaseName, tableName);
}
}

protected override void RunCore()
{
foreach(ProcedureTemplate tempalte in this.Templates)
{
tempalte.RenderToFile(tempalte.GetProcedureName()
+ ".sql");
}
}
}
#
>

NET技術創(chuàng)建代碼生成器可以很簡單:如何通過T4模板生成代碼?[下篇],轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 免费视频一区二区 | 51ⅴ精品国产91久久久久久 | 91精品久久久久久久久 | 亚洲精品国产成人 | 日韩aⅴ片 | 国产精品日韩在线观看一区二区 | 国产欧美日韩一区二区三区在线 | 日韩在线播放一区 | 日韩91在线| 天天草av | 剑来高清在线观看 | 91精品国产91久久久久久吃药 | 看片91| 中文字幕1区| 亚洲 欧美 另类 综合 偷拍 | 欧美一区二区三区国产 | 91青娱乐在线 | av在线免费观看网站 | 欧美一级黄色片免费观看 | 一区二区三区视频在线免费观看 | 亚洲午夜精品一区二区三区他趣 | 黄色免费观看网站 | www四虎影视| 国产露脸国语对白在线 | 韩日三级 | 精品视频在线观看 | 91一区二区三区在线观看 | 日本淫视频| 国产在线观看免费 | 国产精品视频一二三 | 久久久国产一区二区三区四区小说 | 欧美日韩精选 | 大乳boobs巨大吃奶挤奶 | 久久久www成人免费精品 | 一区二区三区日韩精品 | 日韩精品久久 | 欧美久久不卡 | 国产精品久久久久久久白浊 | 日本精品久久久久 | 国产成人黄色 | 国产一区在线免费观看 |