一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

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

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

  一、多文件代碼生成器會(huì)帶來(lái)多大的便利?

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

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

  甚至有的時(shí)候我們連數(shù)據(jù)表列表都無(wú)需指定,讓SQL Generator為所有的表都生成相應(yīng)的存儲(chǔ)過(guò)程。我的例子中沒(méi)有提供這樣的功能,但是實(shí)現(xiàn)自來(lái)不會(huì)存在任何問(wèn)題。

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

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

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

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

<#@ 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技術(shù)創(chuàng)建代碼生成器可以很簡(jiǎn)單:如何通過(guò)T4模板生成代碼?[下篇],轉(zhuǎn)載需保留來(lái)源!

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

主站蜘蛛池模板: 国产91高清 | 亚洲欧美婷婷 | 麻豆91视频 | 色女人影院 | 国产精品青草久久福利不卡 | 亚洲综合丁香婷婷六月香 | 人人干人人爽 | 欧美成人免费一区在线播放 | 国产在线视频一区 | 超级97人人公开视频 | 亚洲人体一区 | 午夜网站视频 | 精品视频免费在线观看 | 国产成人aa视频在线观看 | 精品一区二区三区免费观看 | 在线观看精品视频一区二区 | 深夜小视频在线观看 | 国产精品成人亚洲 | 国产成在线观看免费视频 | 国内精品一区二区 | 亚洲视频四区 | 激情偷拍网 | 日本一区二区高清不卡 | 日本一道一区二区免费看 | 国产第一页久久亚洲欧美国产 | 国产小视频91 | 亚州一级毛片 | 欧美成人免费午夜影视 | 成 人 黄 色 视频播放165 | 黄色视屏在线播放 | 五月激情久久 | 国产在线一区二区三区 | 啪啪色网 | 国产精品100页 | 日韩精品永久免费播放平台 | 国产一区二区三区在线看 | 亚洲欧美一区二区三区四区 | 波多野结衣在线影院 | 国产精品四虎在线观看免费 | 视频在线欧美 | 男女激情视频国产免费观看 |