日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

三层架构之泛型应用

發布時間:2025/5/22 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 三层架构之泛型应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? 一說到三層架構,我想大家都了解,這里就簡單說下,三層架構一般包含:UI層、DAL層、BLL層,其中每層由Model實體類來傳遞,所以Model也算是三層架構之一了,例外為了數據庫的遷移或者更OO點,DAL層就衍生出了IDAL接口。Model就是簡單的對應數據庫里面的類,DAL層就是主要操作數據庫的方法了,BLL這個就看業務了。而DAL層大部分的方法都是差不多,無非就是幾個Insert,Update,Delete,Select。

????? 再來說下泛型,這個是2.0才開始有的,算是2.0中一個非常重要的技術了,關于泛型有什么好處優點就不說了,網上一大堆,其實說了也沒有什么用,大家在實踐中運用了就知道,我覺得泛型一個最核心的地方就是,泛型封裝了類型,把類型的定義延遲到了客戶端,泛型又像一個類型的模板,只要你定義了一個泛型類,就相當于定義了N個類,每個類的類型不一樣而已。

????? 上面我們說了,三層架構中的DAL層一般包括Insert,Update,Delete,Select這幾種了,那么在泛型還沒有到來之前,我們的程序員兄弟一般是怎么做的,首先為每個實體定義一個DAL接口,比如有個User這個實體對象,那么就有一個IUserDAL這個接口以及UserDAL這個實現類,如果有N個實體,那么差不多就需要N個接口和實現類了,而這些接口中的Insert,Update,Delete,Select的方法簽名都是類似的,唯一的不同就是方法參數和返回值的類型了,我們來看下基本的接口定義

1 public interface IUserDAL 2 { 3 int Insert(User model); 4 int Update(User model); 5 int Delete(int id); 6 User GetModel(int id); 7 DataTable GetList(); 8 }

?

那么在一個項目中,像這樣的接口定義到處可見,大部分是重復的寫法,雖然我們有任勞任怨的代碼生成工具為我們效勞,但是從設計角度或者站在新技術的角度看,這些代碼就顯得很不優雅,很不爽了,我想你的感覺也是這樣吧,呵呵O(∩_∩)O~。

?????? 當泛型來臨時,我們終于可以不看到那么多的重復接口的定義了,終于可以喘一口氣了,那么泛型又是怎么實現的呢,在實現之前我們回頭看下我們沒有泛型的IUserDAL的定義,其中Insert,Update方法就一個User參數,類似的其他接口也就一個參數,只是類型不是User了,可能是Order,或者其他的,在來看下GetModel返回值類型是User,GetList也是一樣的,只是這里我們用DataTable這個萬能的類型來代替了,但是大家都知道DataTable這個類型臃腫又是弱類型的,在UI層調用的時候又不知道這個DataTable里面到底有什么字段,這個就在開發期帶來一定的麻煩。

????? 泛型的實現終于上場了,其實很簡單,不就是一對尖括號嗎,是的,只要在IUserDAL后面加對尖括號,里面用一個字符代替類型就可以了,哦,對了還要加個泛型約束呢,就是一個where,也就是說,這個泛型的類型只能是引用的類型,不能是值類型,難道你的Model是一個值類型??不可能吧,反正我是不信。那么這個泛型接口的定義就是:

1 public interface IDAL<T> where T : class 2 { 3 int Insert(T model); 4 int Update(T model); 5 int Delete(int id); 6 T GetModel(int id); 7 IList<T> GetList(); 8 }

?

?哦,原來那么簡單就是加個T把之前的User類型給【換了】就可以啦,我怎么沒有想到呢,嗚嗚,那么在UserDAL這個繼承類中就可以明確定義那個泛型的類型了,因為我這個類就是用來實現User這個實體類的(或者說數據庫的表吧),這里,UserDAL我們就叫IUserDAL的客戶端了。代碼如下:

1 public class UserDAL : IDAL<User>2 {3 #region IDAL<User> 成員4 5 public int Insert(User model)6 {7 //coding8 }9 10 public int Update(User model) 11 { 12 //coding 13 } 14 15 public int Delete(object id) 16 { 17 //coding 18 } 19 20 public User GetModel(object id) 21 { 22 //coding 23 } 24 25 public IList<User> GetList() 26 { 27 //coding 28 } 29 30 #endregion 31 }

?

好了,我們解放了DAL和IDAL,那么BLL層可以用泛型嗎,當然可以。

?????? 我們先來說下,不用泛型的BLL層的實現,這里不考慮BLL的業務的話,那么BLL就是單純的調用DAL的相關數據庫操作方法,也就是那個IUserDAL接口定義的方法了,一般的UserBLL代碼如下:

1 public class UserBLL2 {3 private IUserDAL dal = new UserDAL();4 5 public int Insert(User model)6 {7 return dal.Insert(model);8 }9 10 public int Update(User model) 11 { 12 return dal.Update(model); 13 } 14 public int Delete(int id) 15 { 16 return dal.Delete(id); 17 } 18 public T GetModel(int id) 19 { 20 return dal.GetModel(id); 21 } 22 public DataTable GetList() 23 { 24 return dal.GetList(); 25 } 26 }

?

我想這個是最簡單的BLL代碼了,而且大部分小的項目這樣就已經夠了,因為沒有什么業務嘛,但是如果想這樣的代碼每個BLL都這樣謝,一個項目幾十個上百個也這樣寫真的會累死人的,代碼工具雖然可以解決,但是當我們看到那么多的重復代碼,相似的代碼,真的很心痛,難道你不覺得心痛,如果你不覺得或者也不想去改的話或者以后還是那樣寫重復的代碼,用代碼工具幫做的話,我想你的code能力也不會怎么提高,廢話一下。

????? 那么用泛型的話,我們就可以為所有的BLL定義一個基類,其他類只要繼承下,稍微的根據業務的不同增加點業務代碼就可以,甚至都可以不用繼承了,我們先看代碼的實現吧,搞這行代碼才是最好說話的,請看下面代碼:

1 public class BaseBLL<T, D>2 where T : class3 where D : IDAL<T>,new ()4 {5 private D dal = new D();6 7 public virtual int Insert(T model)8 {9 return dal.Insert(model); 10 } 11 12 public virtual int Update(T model) 13 { 14 return dal.Update(model); 15 } 16 public virtual int Delete(object id) 17 { 18 return dal.Delete(id); 19 } 20 public virtual T GetModel(object id) 21 { 22 return dal.GetModel(id); 23 } 24 public virtual IList<T> GetList() 25 { 26 return dal.GetList(model); 27 } 28 }

?

?? 這個也簡單把,也就是把實體類換為T,把IDAL接口換為D,并定義D這個類型的約束,也就是說我的這個D一定是一個實現了IDAL<T>這個接口的,而IDAL尖括號里面的T就是BaseBLL里面的T,看到這里,相信大家都應該明白了,如果你想實現UserBLL,就可以繼承BaseBLL這個基類,這里為什么把BaseBLL中的方法定義為virtual呢,原因很簡單的,因為你的BLL層的其他類不可能就沒有業務,不可能就是簡單的調用DAL方法吧,其他的BLL類就可以根據業務去override相關的方法了,UserBLL相應代碼如下:

1 public class UserBLL : BaseBLL<User, UserDAL> 2 { 3 4 }

?

如果UserBLL沒有任何業務的話,那就不要繼承了,在UI直接用BaseBLL這個泛型類就可以,調用也很簡單

?????? BaseBLL<User> dal=new BaseBLL<User>();這樣就可以了。

?

?????? 之所以寫這篇隨筆,是因為08年那時,我剛剛畢業投入工作后第一次看到讓我崇拜的代碼設計,好像那個時候泛型也剛開始盛行吧。

????? 最后,感謝大家的閱讀,希望大家多多支持我的博客,我是最近一個月才開始寫博客的,后面會有更精彩的內容等著你來閱讀。

?

?

?

?

?

?

?

?

?

?

?

?

?

總結

以上是生活随笔為你收集整理的三层架构之泛型应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。