ASP.NET MVC+EF框架+EasyUI實現權限管系列
(開篇) (1):框架搭建 (2):數據庫訪問層的設計Demo (3):面向接口編程 (4 ):業務邏輯層的封裝
(5):前台Jquery easyUI實現 (6):EF上下文實例管理 (7):DBSession的封裝 (8):DBSession線程內唯一
前言:前面我們基本已經完成了一個Demo,我們在后面的權限也就是按照這個Demo的思路來實現的,只需要給底層添加東西,然后實現業務,權限的邏輯業務有點小復雜,所以大家可以先在博客園隨便看看權限方面的業務,當然我說到的時候也會在說的,今天我們就來探討一下TT模板在本項目重的使用,如果你學會了TT模板,可以大大的減少你的代碼的書寫量,當然對於TT模板我也正在研究中,所以這篇寫的都是基礎,以后會繼續在寫的,下面開始今天我們的TT模板的使用學習,謝謝大家的瀏覽。
1.為什么需要T4模板
(1)當我們項目寫到第七篇開始的時候,我們慢慢就會有那種感覺吧,如果我們的數據庫實體非常多的話,而且我們的數據庫訪問接口層(LYZJ.UserLimitMVC.IDAL)的接口也非常多,並且每個實體都對應一個RoleRepository(倉儲),UserInfoRepository(倉儲),重點是每個實體倉儲的內容基本相同,這時候我們就想怎么辦呢?如果每個都寫的話,工程量大(假如有成千上萬個表的話就要寫成千上萬個實體接口,不敢想象這是什么工程),而且數據庫訪問層(LYZJ.UserLimitMVC.IDAL)的內容也需要這樣寫。
(2)上面我們看到的這段文字闡述了一個問題,那么我們有什么辦法能夠讓系統自動的給我們去生成這些東西呢,這時候我們就想到了代碼生成器(TT)模板。
(3)既然是代碼生成器模板,那就需要我們自己書寫模板,只要我們將模板書寫好,其他的東西都會幫助我們自動生成。
(4)那么我們介紹的就是微軟標准的生成代碼的模板,即TT模板。
2.T4模板的創建
(1)首先我們在數據庫訪問層(LYZJ.UserLimitMVC.DAL)右鍵添加新建項,然后我們選擇常規下面的文本模板選項(在Entity FrameWork5.0中使用的就是TT模板幫助我們生成一些相同的類),起名為MyFirst.TT,也就是我的第一個TT模板的創建,如下圖所示:
(2)當我們創建完TT模板之后,首先我們看到的是一段引用代碼,代碼如下所示:
1 <#@ template debug="false" hostspecific="false" language="C#" #> 2 3 <#@ assembly name="System.Core" #> 4 5 <#@ import namespace="System.Linq" #> 6 7 <#@ import namespace="System.Text" #> 8 9 <#@ import namespace="System.Collections.Generic" #> 10 11 <#@ output extension=".txt" #> 將txt改為cs
(3)這時候我們看到第一行里面的language=”C#”,表明我們當前使用的編程語言是C#,最后一行的output表明是一個輸出的對象,extension表示輸出的后綴是什么,在這里我們要輸出類文件,所以將txt改為cs。
3.T4模板的簡單小案例
(1)當我們知道TT模板的用處的時候,這時候做為我們初學者的話,我們是不是非常迫切的想知道TT模板是如何編寫的呢,下面我就隨便寫一個循環的模板給大家演示一下神奇之處,代碼如下:
1 <#@ template debug="false" hostspecific="false" language="C#" #> 2 3 <#@ assembly name="System.Core" #> 4 5 <#@ import namespace="System.Linq" #> 6 7 <#@ import namespace="System.Text" #> 8 9 <#@ import namespace="System.Collections.Generic" #> 10 11 <#@ output extension=".cs" #> 12 13 using System; 14 15 public class Kencery 16 17 { 18 19 <# for(int i=0;i<10;i++){#> 20 21 public int HYL<#=i#>{get;set;} 22 23 <# }#> 24 25 }
(2)在我們WebForm的時候我們是如何來實現C#代碼的呢?就是<% %>格式來實現對C#代碼的操作,而在TT模板里面我們稍微變化了一下,那就是<# #>。
(3)這段代碼很簡單,大部分博友應該知道什么意思?如果大家不知道的話可以隨時Q我,我們共同探討,這里就不說了,當我們書寫萬TT代碼的時候,然后我們單擊保存的時候就會自動生成一個MyFirst.CS類,對應上面TT模板中代碼生成的代碼如下:
1 using System; 2 3 public class Kencery 4 5 { 6 7 public int HYL0{get;set;} 8 9 public int HYL1{get;set;} 10 11 public int HYL2{get;set;} 12 13 public int HYL3{get;set;} 14 15 public int HYL4{get;set;} 16 17 public int HYL5{get;set;} 18 19 public int HYL6{get;set;} 20 21 public int HYL7{get;set;} 22 23 public int HYL8{get;set;} 24 25 public int HYL9{get;set;} 26 27 }
(4)在TT模板里面有很多的知識點,當然我也沒有學到,只是會點簡單的東西來使用而已。這篇博客我就將我所會的都寫出來了,一般情況下我們很少自己去寫TT模板,直接去安裝插件或者去網上查找來實現。
4.根據數據庫中的表生成所有表對應的倉儲
(1)根據上述的介紹我們已經大致的知道了怎么去使用TT模板,下面我們就針對這個項目來實現一個根據數據庫中的表生成所有表對應的倉儲的TT模板,我們打開數據庫訪問層(LYZJ.UserLimitMVC.DAL)里面的RoleRepository的代碼,復制到我們建立的TT模板中,RoleRepsoitory中的代碼如下所示:
1 using System; 2 3 using System.Collections.Generic; 4 5 using System.Linq; 6 7 using System.Text; 8 9 using System.Threading.Tasks; 10 11 using LYZJ.UserLimitMVC.IDAL; 12 13 using LYZJ.UserLimitMVC.Model; 14 15 16 namespace LYZJ.UserLimitMVC.DAL 17 18 { 19 20 public class RoleRepository : BaseRepository<Role>, IRoleRepository 21 22 { 23 26 } 27 28 }
(2)然后我們新建一個TT模板IService.TT模板,將上面的代碼復制到TT模板中進行修改,首先我們看上面聲明的類就是我們讀取出數據庫中的表名再加上Repository后綴,也就是RoleRepository,然后我們后面的繼承的及倉儲是固定的,變換一下表名即可。還有后面的接口也是換掉中間的表名,一些細節的東西我在注注釋里面都寫了,大家可以參考一下,最后就會改成如下的TT模板:
<#@ template debug="false" hostspecific="true" language="C#" #> <#@ include file="EF.Utility.CS.ttinclude"#> //引進TT模板的命名空間 <#@ output extension=".cs" #> <# CodeGenerationTools code = new CodeGenerationTools(this); MetadataLoader loader = new MetadataLoader(this); CodeRegion region = new CodeRegion(this, 1); MetadataTools ef = new MetadataTools(this); string inputFile = @"..\\LYZJ.UserLimitMVC.Model\\DataModel.edmx"; EdmItemCollection ItemCollection = loader.CreateEdmItemCollection(inputFile); string namespaceName = code.VsNamespaceSuggestion(); EntityFrameworkTemplateFileManager fileManager = EntityFrameworkTemplateFileManager.Create(this); #> //使用TT模板生成代碼的片段 using System.Data.Objects; using LYZJ.UserLimitMVC.IDAL; using LYZJ.UserLimitMVC.Model; namespace LYZJ.UserLimitMVC.DAL { //在這里需要一個for循環來遍歷數據庫中所有的表放置在下面即可,這樣就實現了所有的表對應的倉儲顯示出來了。 <# //使用foreach循環遍歷ItemCollection.GetItems<EntityType>集合 foreach(EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e=>e.Name)) { #> public partial class <#=entity.Name#>Repository : BaseRepository<<#=entity.Name#>>, I<#=entity.Name#>Repository { } <#}#> }
(3)上面的這段TT模板的代碼實現了將數據庫訪問層的實體代碼全部轉換成cs代碼,因為我們現在實體模型中含有Role和UserInfo兩張表的信息,所以最后使用TT模板生成的代碼如下所示:
1 //引進TT模板的命名空間 2 3 //使用TT模板生成代碼的片段 4 5 using System.Data.Objects; 6 7 using LYZJ.UserLimitMVC.IDAL; 8 9 using LYZJ.UserLimitMVC.Model; 10 namespace LYZJ.UserLimitMVC.DAL 11 12 { 13 14 //在這里需要一個for循環來遍歷數據庫中所有的表放置在下面即可,這樣就實現了所有的表對應的倉儲顯示出來了。 15 16 public partial class RoleRepository : BaseRepository<Role>, IRoleRepository 17 18 { 19 } 20 21 public partial class UserInfoRepository : BaseRepository<UserInfo>, IUserInfoRepository 22 23 { 24 } 25 }
(4)記得在模版里面和數據庫訪問層里面的代碼在聲明類的時候都要定義成部分類,什么作用相比大家都清楚,就不相信說了。
(5)在這里我要聲明的一點就是不管我們以后再寫代碼或者干和寫代碼相關的事情的時候,只要遇到是生成的代碼,我們都要定義成部分類(partial)。
5.小結
(1)這篇博客我就大致的說了一下TT模版的使用,說的不夠詳細,相信大家也從這點看不出來什么,我在這合理推薦這篇博客,大家可以自己學一下TT模板的使用,真的非常方便,簡單!參考資料。
學習資料:http://www.cnblogs.com/lzrabbit/archive/2012/07/15/2591085.html
(2)明天我們就開始在說說源代碼管理器的使用,我說的是VSS,也就是針對項目來說一下,可能還是講的怎么使用,如果大家想要詳細的學習的話,建議多去網上搜搜。
(3)最后祝願大家身體健康,遠離禽流感!!
源碼下載
(1):完整源碼下載
Kencery返回本系列開篇