日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
三層架構(gòu)之泛型應(yīng)用

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

創(chuàng)新互聯(lián)建站2013年至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站制作、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元梅州做網(wǎng)站,已為上家服務(wù),為梅州各地企業(yè)和個人服務(wù),聯(lián)系電話:13518219792

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

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

 
 
 
  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.     } 

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

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

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

 
 
 
  1. public interface IDAL 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 GetList();  
  8.    } 

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

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

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

我們先來說下,不用泛型的BLL層的實(shí)現(xiàn),這里不考慮BLL的業(yè)務(wù)的話,那么BLL就是單純的調(diào)用DAL的相關(guān)數(shù)據(jù)庫操作方法,也就是那個IUserDAL接口定義的方法了,一般的UserBLL代碼如下:

 
 
 
  1. public class UserBLL  
  2.      {  
  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代碼了,而且大部分小的項(xiàng)目這樣就已經(jīng)夠了,因?yàn)闆]有什么業(yè)務(wù)嘛,但是如果想這樣的代碼每個BLL都這樣謝,一個項(xiàng)目幾十個上百個也這樣寫真的會累死人的,代碼工具雖然可以解決,但是當(dāng)我們看到那么多的重復(fù)代碼,相似的代碼,真的很心痛,難道你不覺得心痛,如果你不覺得或者也不想去改的話或者以后還是那樣寫重復(fù)的代碼,用代碼工具幫做的話,我想你的code能力也不會怎么提高,廢話一下。

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

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

這個也簡單把,也就是把實(shí)體類換為T,把IDAL接口換為D,并定義D這個類型的約束,也就是說我的這個D一定是一個實(shí)現(xiàn)了IDAL 這個接口的,而IDAL尖括號里面的T就是BaseBLL里面的T,看到這里,相信大家都應(yīng)該明白了,如果你想實(shí)現(xiàn)UserBLL,就可以繼承BaseBLL這個基類,這里為什么把BaseBLL中的方法定義為virtual呢,原因很簡單的,因?yàn)槟愕腂LL層的其他類不可能就沒有業(yè)務(wù),不可能就是簡單的調(diào)用DAL方法吧,其他的BLL類就可以根據(jù)業(yè)務(wù)去override相關(guān)的方法了,UserBLL相應(yīng)代碼如下:

 
 
 
  1. public class UserBLL : BaseBLL 
  2.     {  
  3.          
  4.     } 

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

BaseBLL dal=new BaseBLL();這樣就可以了。

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

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

作者:風(fēng)雨彩虹

出處:http://www.cnblogs.com/liubiaocai/


分享題目:三層架構(gòu)之泛型應(yīng)用
分享地址:http://www.5511xx.com/article/coiesic.html