C 回顧學習筆記四十 三層架構

2021-08-08 20:08:28 字數 4615 閱讀 6131

1)三層框架是什麼?

按照書籍和部落格文章裡千篇一律的解釋就是:ui層、bll層、dal層。這樣的解釋通常無法讓人一時半會理解含義,總而言之在這裡先大概說明一下三層架構。正如其他文章提到的一樣,三層架構就是:表示層(與使用者直接進行互動)、業務邏輯層(在表示層和資料訪問層中間聯絡兩者的重要角色)、資料訪問層(與資料庫實打實的做交易,訪問資料之類的)。所謂ui層實際上就是跟使用者打交道的那一層,比如控制台應用程式、asp.net web應用程式、窗體應用程式,這些專案檔案都是用於跟使用者打交道的,所以就是ui層。

2)為什麼使用三層框架?

假設有乙個窗體應用程式,比如新建了乙個winform窗體應用。使用者單擊註冊按鈕後,將各種資料提交到後台,此時你可以直接呼叫executenonquery()方法並將使用者資料寫入資料庫。而三層架構的特點就是將使用者註冊的業務提交給了bll層,再由bll層提交給dal層處理問題,這樣使用者的註冊業務就經過了好幾步才完成。為什麼要這麼麻煩?

有這麼一家飯館,由於剛起步所以只有廚師來管理整個飯館。他們兼顧給客人點菜、做菜、上桌的事情。日子漸漸過去,飯館規模將要擴充,這時候考慮僱傭服務員來為客人點單並將選單交給廚房處理。增加服務員後,客人不會直接與廚師說要什麼菜,因為客人變多意味著廚師變忙,而廚師變忙亂或許還會影響正在做的菜。所以客人就可以將選單交給服務員,而服務員又將選單交給廚房做菜,等廚房菜做好之後,服務員又將菜交給相應的客人。這樣做的好處在於:①讓複雜的工作變得有秩序。②其中任意乙個環節出了問題,能夠更加迅速發現並快速維護。③分工合作使得每個人的工作量變得固定,更加人性化。

**的分層能讓不同職員負責不同的層,通過分層能將業務細節分解,將不同功能的**分散出來。這樣做更加有利於系統的開發,業務越大可能分的層也越多,都是為了讓系統便於維護和擴充套件。從另一方面講,分工合作的優勢就是讓適合的人做自己擅長的事情,使得平均勞動時間變短,讓效率變高。軟體的分層實際上就是實現「高內聚、低耦合」。就以上面的【使用者單擊註冊按鈕】的例子來講,所有的包括業務邏輯、資料庫操作用到的方法甚至sql語句都存在乙個form1類裡面,這就必須使得做這個專案的人不但要會業務邏輯,還要懂資料庫操作。如果分為三層來操作,那麼ui層的編碼人員不需要懂sql語句,它只要知道呼叫乙個別人寫好的方法就可以獲得自己需要的東西就可以了,這樣結構更加清晰,分工更明確。

3)如何使用三層架構?

以乙個從資料庫查詢表並返回到窗體上的例子來解釋,只要清楚了這個查詢怎麼實現,其他的增刪改查也用同樣的套路完成。

第1步,本次實驗使用sqlserver。先設計好資料庫,新建表student並新增一些記錄,表字段如下:

第2步,新建model類庫檔案,雖然models不在三層架構的概念說明裡(ul、bll、dal),但卻是開發必要的。models提供實體類,貫穿整個專案,三層都需要用到它。在解決方案上右鍵-新增-新建專案-類庫,名字叫student.model。在類庫檔案下新建實體類,名字是students.cs,為了節省篇幅這裡使用自動屬性,**如下:

public class students  

public int? weight

public int? tall

public string gender

public string birthday

public string name

public int id

}

第3步,按照新增model類庫檔案的做法新增乙個dal類庫檔案,名字叫student.dal。因為上面提到過實體類貫穿三層,因此dal層要新增對model的引用,在。在類庫檔案下新建sqlhelper類用於實現資料庫操作,新建studentdal類用於接收來自bll層的增刪改查處理。

第4步,新建類庫檔案(dal層),取名叫student.dal,上面提到過實體類貫穿整個專案,因此dal層要新增對student.model的引用。在「引用」上右鍵-新增引用-解決方案,找到student.model並勾選確定。然後在dal類庫檔案下新建studentdal類和sqlhelper類。studentdal類主要提供業務處理需要用到的方法,比如查詢表,比如根據id查詢使用者,比如刪除使用者等等……這裡只提供查詢表的方法。sqlhelper類主要是對資料庫實際進行查詢操作需要用到的方法。詳細**如下

studentdal類**(注意先using student.model;):

public class studentdal

}

sqlhelper類**:

class sqlhelper

//執行查詢:select返回多行多列

public static datatable executequery(sqlconnection conn, string sql, params sqlparameter parameters)

}return table;//返回載入的表

}public static datatable executequery(string sql, params sqlparameter parameters)}}

注意:sqlhelper類中的executequery()方法構成過載,主要是方便dal層呼叫這個方法時少傳入乙個sqlconnection物件的引數,這些都在sqlhelper類內部進行處理並自動呼叫真正實現查詢操作的方法來處理資料了。

第5步,新建類庫檔案(bll層),取名叫student.bll。bll層需要將任務提交給dal層處理,並且上面提到過實體類貫穿整個專案,因此bll層要新增對dal層和model的引用,參照上面的方式,新增對student.dal和student.model的引用。在bll類庫檔案下新建studentbll類,詳細**如下

studentbll類的**(注意先using student.model;和using student.dal;):

public class studentbll

}

第6步,新建winform窗體應用,這表示ui層。假設名字叫student.winform。先using student.bll;,然後在窗體上新增乙個datagridview控制項,如下:

其中name屬性的值與dal層下sqlhelper類中的connectionstrings["testconn"]保持一致。server表示資料庫位址,小數點代表本地位址。database表示資料庫名字。uid是資料庫登入使用者名稱。pwd是資料庫登入密碼。

接著新增窗體應用程式的**,主要新增乙個load事件,詳細**如下:

public partial class form1 : form

private void form1_load(object sender, eventargs e)

}

第8步,將student.winform設為啟動項並執行程式,如果能觀察到執行結果則說明沒有問題。

4)對上面**執行過程做解釋

1.執行窗體程式會自動執行load事件的**,先宣告studentbll類的物件,然後就可以呼叫bll層的select()方法。

2.bll層會先宣告studentdal類的物件,然後繼續呼叫dal層的select()方法。bll層並不實現查詢操作,只是將這個任務交給dal層處理了。

3.dal層的select()方法會呼叫sqlhelper類的executequery()方法。在sqlhelper類內部又會先呼叫寫好的獲得乙個sqlconnection物件的方法,並呼叫構成過載的另乙個executequery()方法。

4.構成過載的這個executequery()是具體實現資料庫操作的方法,查詢到表結果後逐步返回到dal層的select()方法裡。

5.dal層的select()方法已經獲得呼叫executequery()方法返回的表結果,並將這個表結果返回到呼叫它的bll層裡。bll層又將表結果返回到呼叫bll層的ui層裡。

6.ui層裡執行datagridview1.datasource = table;用於將表資料填充到控制項上顯示。至此完成表資料查詢操作。

5)三層架構的概念補充

1.參照上面對三層架構的講解與練習,實際上可以用一張來解釋上面的執行過程。理解三層架構的含義後,甚至用這張**釋上面提到的餐館例子也可以。ui層相當於客戶,bll層相當於服務員,而dal層相當於廚師。

2.有**生成器可以自動生成三層架構的專案,甚至連資料庫增刪改查方法都提供了。比如「動軟**生成器」,當然不要太依賴軟體的「自動」。

3.或許在做了上面三層架構的練習後,會覺得bll層的功能微乎其微。實際上在bll層可以進行邏輯判斷,這也正是bll層的好處所在。比如bll層拿到dal層返回過來的資料後,可以進行相應的if判斷,確保資料滿足業務需求,再返回給ui層。

C Primer Plus學習 四十三 結構變數

結構宣告 structuredeclaration 是描述結構如何組合的主要方法。宣告就像下面這樣 struct book 詞語 結構 structure 有兩個意思。個意思是 結構設計 這個我們剛剛已經討論過了。結構 設計告訴編譯器如何表 示資料,但是它沒有讓計算機為資料分配空間。下 步是建立乙個...

大資料學習筆記之四十三 深度學習的基本方法

1 自動編碼器 1.1 內涵 是乙個逐層的貪心演算法,在每一次迭代中訓練一層網路,然後使用乙個類似於後向傳播的演算法對深度網路進行調優 1.2 思想 將深度網路看成一連串的自動編碼器,包括兩個階段 1,第一階段是編碼階段,編碼階段對應輸入層到隱藏層的對映 2,第二階段是解碼階段,對應的是隱藏層到輸出...

Linux效能優化實戰學習筆記 第四十三講

nat 基於 linux 核心的連線跟蹤機制,實現了 ip 位址及埠號重寫的功能,主要被用來解決公網 ip 位址短缺的問題。在分析 nat 效能問題時,可以先從核心連線跟蹤模組 conntrack 角度來分析,比如用systemtap perf netstat 等工具,以及 proc 檔案系統中的核...