三層架構之泛型應用

2021-09-08 01:58:54 字數 3695 閱讀 4041

一說到三層架構,我想大家都了解,這裡就簡單說下,三層架構一般包含: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 inte***ce iuserdal

2

那麼在乙個專案中,像這樣的介面定義到處可見,大部分是重複的寫法,雖然我們有任勞任怨的**生成工具為我們效勞,但是從設計角度或者站在新技術的角度看,這些**就顯得很不優雅,很不爽了,我想你的感覺也是這樣吧,呵呵o(∩_∩)o~。

當泛型來臨時,我們終於可以不看到那麼多的重複介面的定義了,終於可以喘一口氣了,那麼泛型又是怎麼實現的呢,在實現之前我們回頭看下我們沒有泛型的iuserdal的定義,其中insert,update方法就乙個user引數,類似的其他介面也就乙個引數,只是型別不是user了,可能是order,或者其他的,在來看下getmodel返回值型別是user,getlist也是一樣的,只是這裡我們用datatable這個萬能的型別來代替了,但是大家都知道datatable這個型別臃腫又是弱型別的,在ui層呼叫的時候又不知道這個datatable裡面到底有什麼字段,這個就在開發期帶來一定的麻煩。

泛型的實現終於上場了,其實很簡單,不就是一對尖括號嗎,是的,只要在iuserdal後面加對尖括號,裡面用乙個字元代替型別就可以了,哦,對了還要加個泛型約束呢,就是乙個where,也就是說,這個泛型的型別只能是引用的型別,不能是值型別,難道你的model是乙個值型別??不可能吧,反正我是不信。那麼這個泛型介面的定義就是:

1     public inte***ce idalwhere t : class

2

哦,原來那麼簡單就是加個t把之前的user型別給【換了】就可以啦,我怎麼沒有想到呢,嗚嗚,那麼在userdal這個繼承類中就可以明確定義那個泛型的型別了,因為我這個類就是用來實現user這個實體類的(或者說資料庫的表吧),這裡,userdal我們就叫iuserdal的客戶端了。**如下:

1     public class userdal : idal2     

9 10 public int update(user model)

11

14 15 public int delete(object id)

16

19 20 public user getmodel(object id)

21

24 25 public ilistgetlist()

26

29 30 #endregion

31 }

好了,我們解放了dal和idal,那麼bll層可以用泛型嗎,當然可以。

我們先來說下,不用泛型的bll層的實現,這裡不考慮bll的業務的話,那麼bll就是單純的呼叫dal的相關資料庫操作方法,也就是那個iuserdal介面定義的方法了,一般的userbll**如下:

1     public class userbll

2

9 10 public int update(user model)

11

14 public int delete(int id)

15

18 public t getmodel(int id)

19

22 public datatable getlist()

23

26 }

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

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

1     public class basebll2         where t : class

3 where d : idal,new ()

4

11 12 public virtual int update(t model)

13

16 public virtual int delete(object id)

17

20 public virtual t getmodel(object id)

21

24 public virtual ilistgetlist()

25

28 }

這個也簡單把,也就是把實體類換為t,把idal介面換為d,並定義d這個型別的約束,也就是說我的這個d一定是乙個實現了idal這個介面的,而idal尖括號裡面的t就是basebll裡面的t,看到這裡,相信大家都應該明白了,如果你想實現userbll,就可以繼承basebll這個基類,這裡為什麼把basebll中的方法定義為virtual呢,原因很簡單的,因為你的bll層的其他類不可能就沒有業務,不可能就是簡單的呼叫dal方法吧,其他的bll類就可以根據業務去override相關的方法了,userbll相應**如下:

1     public class userbll : basebll2

如果userbll沒有任何業務的話,那就不要繼承了,在ui直接用basebll這個泛型類就可以,呼叫也很簡單

baseblldal=new basebll();這樣就可以了。

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

三層架構之工廠模式(基於泛型)

1 目錄 2 model層 2.1 basemodel namespace study.model 2.2 user namespace study.model set public int age set 3 idal層 3.1 ibasedal namespace study.idal 3.2 ...

三層架構之模型層

你好,是我琉憶。今天我們講一講三層架構的模型層。為了讓大家能夠更好的理解三層架構,我們通過三層架構實現登入功能,讓你更全面的理解三層架構和使用。模型層主要儲存的是模型物件實體,這些實體的組合叫做實體類庫,它是資料庫表的對映物件,在資訊系統軟體實際開發的過程中,要建立物件例項,將關聯式資料庫表採用物件...

三層架構之登入

在專案開發的過程中,有時把整個專案分為三層架構,其中包括 表示層 ui 業務邏輯層 bll 和資料訪 問層 dal 三層的作用分別如下 表示層 為使用者提供互動操作介面,這一點不論是對於web還是winform都是如此,就是使用者介面操作 我們 展示給使用者看的介面。業務邏輯層 負責關鍵業務的處理和...