關(guān)于代碼生成工具下載,創(chuàng)建代碼生成器可以很簡單 如何通過T4模板生成代碼 下篇這個(gè)問題很多朋友還不知道,今天小六來為大家解答以上的問題,現(xiàn)在讓我們一起來看看吧!
1、在《上篇》中我們通過T4模板為我們指定的數(shù)據(jù)表成功生成了我們需要的用于添加、修改和刪除操作的存儲(chǔ)過程。
2、但是這是一種基于單個(gè)文件的解決方案,即我們必須為每一個(gè)生成的存儲(chǔ)過程建立一個(gè)模板。
3、如果我們提供一種基于多文件的代碼生成方式,將會(huì)為編程人員帶來極大的便利。
4、借助于T4 ToolBox這個(gè)開源工具箱,多文件的SQL Generator的實(shí)現(xiàn)變得異常簡單。
5、[文中的例子可以從這里下載]目錄二、創(chuàng)建自定義的Generator三、ProcedureGenerator如何被使用?一、多文件代碼生成器會(huì)帶來多大的便利?我們先來直觀的感受一下較之《上篇》提供的單一文件的代碼生成器,基于多文件的代碼生成解決方案會(huì)為開發(fā)人員帶來多大的便利。
6、 同樣對(duì)于《上篇》創(chuàng)建的數(shù)據(jù)表T_PRODUCT,之前我們?yōu)榱松扇齻€(gè)不同的存儲(chǔ)過程,我們不得已需要?jiǎng)?chuàng)建3個(gè)不同的T4模板文件。
7、實(shí)際上我們更需要的方式只需要?jiǎng)?chuàng)建一個(gè)T4模板,讓我們的SQL Generator自動(dòng)為我們生成3個(gè)包含相應(yīng)存儲(chǔ)過程的.sql附屬文件,如左圖所示(點(diǎn)擊看大圖)。
8、有的時(shí)候,基于單個(gè)數(shù)據(jù)表的存儲(chǔ)過程生成方式我們依然覺得不方便。
9、如果我們能夠在T4模板文件中指定的數(shù)據(jù)表的列表,讓我們的SQL Generator為列表的每一個(gè)數(shù)據(jù)表都生成CUD三個(gè)存儲(chǔ)過程,這樣的方式更加具有吸引力。
10、如右圖所示(點(diǎn)擊看大圖),一個(gè)訂單模塊包含兩個(gè)具有主子關(guān)系的兩張表(T_ORDER和T_ORDER_DETAIL),現(xiàn)在我們?cè)谝粋€(gè)T4模板中指定這兩個(gè)表明,通過SQL Generator可以幫助我們生成6個(gè)包含存儲(chǔ)過程的.sql附屬文件。
11、甚至有的時(shí)候我們連數(shù)據(jù)表列表都無需指定,讓SQL Generator為所有的表都生成相應(yīng)的存儲(chǔ)過程。
12、我的例子中沒有提供這樣的功能,但是實(shí)現(xiàn)自來不會(huì)存在任何問題。
13、二、創(chuàng)建自定義的Generator在《上篇》中我創(chuàng)建了一個(gè)抽象的ProcedureTemplate類,以及三個(gè)基于生成CUD存儲(chǔ)過程的具體ProcedureTemplate:InsertProcedureTemplate、UpdateProcedureTemplate和DeleteProcedureTemplate。
14、它們都將直接服務(wù)于我們今天將要提供的基于多文件的SQL Generator。
15、在《上篇》中,這四個(gè)Template分別定義在4個(gè)不同的TT文件中,3個(gè)具體的ProcedureTemplate通過<#@include>指令將抽象ProcedureTemplate模板文件包含過來。
16、由于我們將要?jiǎng)?chuàng)建的T4模板將會(huì)使用到這四個(gè)類,如果我們用四個(gè)<#@include>指令將四個(gè)TT文件包含過來,由于T4引擎將會(huì)導(dǎo)致對(duì)ProcedureTemplate的4次包含,最好將會(huì)導(dǎo)致變異問題。
17、個(gè)人覺得這應(yīng)該算是T4引擎解析包含關(guān)系的一個(gè)局限性,為了解決這個(gè)問題我們不得不抽象的ProcedureTemplate和三個(gè)具體的ProcedureTemplate都合并成一個(gè)TT文件。
18、T4 ToolBox為類庫中為了提供了一個(gè)抽象的T4Toolbox.Generator類用于實(shí)現(xiàn)多文件的代碼生成。
19、為此我們創(chuàng)建一個(gè)TT模板文件,定義了如下一個(gè)繼承自該類的ProcedureGenerator。
20、ProcedureGenerator的核心是通過屬性Templates定義的類型為IEnumerable
21、而對(duì)于ProcedureGenerator的構(gòu)造函數(shù),處理定義了一個(gè)表示數(shù)據(jù)庫連接字符串的databaseName的參數(shù)外,并以數(shù)組參數(shù)的形式指定了生成的存儲(chǔ)過程基于的數(shù)據(jù)表名的列表。
22、<#@ import namespace="System.Collections.Generic" #><#@ include file="***.tt" #><#@ include file="***.tt" #><#+publicclass ProcedureGenerator : Generator{public IEnumerable
23、由于具體的文本轉(zhuǎn)化邏輯都定義在了ProcedureTemplate中了,所以在這里我們需要遍歷的ProcedureTemplate集合中每一個(gè)Template對(duì)象,調(diào)用RenderToFile方法將相應(yīng)的存儲(chǔ)過程的腳本寫入以存儲(chǔ)過程命名同名的.sql文件中。
24、三、ProcedureGenerator如何被使用?我們最后來看看我們創(chuàng)建的ProcedureGenerator最終如何被應(yīng)用于具體的代碼生成。
25、其實(shí)很簡單,我們只需要?jiǎng)?chuàng)建相應(yīng)的模板文件,通過<#@include>將定義ProcedureGenerator類的TT文件包含近來,最后以代碼語句調(diào)用塊(<#StatementCode#>)的形式實(shí)力化該對(duì)象,并調(diào)用Run方法即可。
26、在構(gòu)造函數(shù)中指定數(shù)據(jù)庫連接字符串的名稱和數(shù)據(jù)表名的列表。
27、下面是基于但表的T4模板。
28、<#@ template language="C#" hostSpecific="true" debug="true" #><#@ include file="Templates***.tt" #><#new ProcedureGenerator("TestDb","T_PRODUCT").Run();#>下面是基于多表的T4模板:<#@ template language="C#" hostSpecific="true" debug="true" #><#@ include file="Templates***.tt" #><#new ProcedureGenerator("TestDb","T_ORDER","T_ORDER_DETAIL").Run();#>當(dāng)你代碼生成工作執(zhí)行之后,會(huì)多出一個(gè)與TT文件同名的附屬文件,你需要手工刪除掉它。
29、從數(shù)據(jù)到代碼--通過代碼生成機(jī)制實(shí)現(xiàn)強(qiáng)類型編程[上篇]從數(shù)據(jù)到代碼--通過代碼生成機(jī)制實(shí)現(xiàn)強(qiáng)類型編程[下篇]從數(shù)據(jù)到代碼--基于T4的代碼生成方式創(chuàng)建代碼生成器可以很簡單:如何通過T4模板生成代碼?[上篇]。
本文分享完畢,希望對(duì)大家有所幫助。
標(biāo)簽:
免責(zé)聲明:本文由用戶上傳,與本網(wǎng)站立場無關(guān)。財(cái)經(jīng)信息僅供讀者參考,并不構(gòu)成投資建議。投資者據(jù)此操作,風(fēng)險(xiǎn)自擔(dān)。 如有侵權(quán)請(qǐng)聯(lián)系刪除!