在對三層架構有了初步瞭解後,用vb.net作了一個小的程序,真的很小,僅僅是爲了體現一下三層之間機制。下面是我設計的操做界面:sql
還有程序集和類的分佈狀況,數據庫
接下來是數據的設計,數據庫用到的是SQL Server2008 架構
三層架構,用簡單的話來歸納說就是:.U層傳入UI命令和參數,而後調用B層的業務邏輯,B層中業務邏輯要用到的數據是經過調用D層訪問數據庫來完成.經過這樣的調用,D層的檢索結果返給B層,B層經過業務邏輯加工、判斷、處理數據,最後將處理結果返給UI層。ui
程序的功能包括對錶中信息的增刪改查,由於都展現出來篇幅過長,就選擇其中添加的功能來進行闡述。接下來看代碼是怎麼體現出來的。spa
先看一下U層是怎麼來引用B層的.net
Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click '添加按鈕 Dim ADDStu As New StuBLL.ManageBLL '實例化B層的類ManageBLL,實現對B層的引用 Dim Ustudent As New StuEntity.StudentEntity '實例化實體層類StudentEntity,方便存儲參數 '對文本框的輸入作限制 If Trim(txtID.Text) = "" Or IsNumeric(Trim(txtID.Text)) = False Then MessageBox.Show("請輸入合適學號,再進行該操做") Exit Sub End If If Trim(txtName.Text) = "" Then MessageBox.Show("請輸入姓名,再進行該操做") Exit Sub End If If Trim(txtTel.Text) = "" Or IsNumeric(Trim(txtTel.Text)) = False Then MessageBox.Show("請輸入聯繫電話,再進行該操做") Exit Sub End If '給實體類的屬性賦值 Ustudent.StuID = CInt((txtID.Text)) Ustudent.StuMarks = Trim(CStr(txtName.Text)) Ustudent.StuTel = CDec(txtTel.Text) '調用類方法 AddStuManager 並報告 If ADDStu.AddStuManager(Ustudent) Then MessageBox.Show("添加成功,請刷新") Else MessageBox.Show("該學號已添加,請從新添加") End If End Sub
經過上面的代碼,知道U層實例化B層的類ManageBLL 調用了它的AddStuManager方法 完成了給操做,它就是這樣引用了B層。設計
接下看看,它所引用的B層是如何構建並實現的:code
Imports StuDAL Imports StuEntity Public Class ManageBLL Public Function AddStuManager(ByVal stuInfoEn As StuEntity.StudentEntity) As Boolean '判斷能否插入信息,並返回布爾值 Dim Controller As New StuDAL.SqlDAL '實例化D層類sqlDAL,完成對D層的引用 Dim StuInfo As New StuEntity.StudentEntity '引用實體類,以便儲存必定的參數 If Controller.IsExist(stuInfoEn) = True Then '根據ID判斷該條記錄是否已經存在,若存在返回False Return False Else '若不存在,執行添加的方法,並返回True Controller.AddStu(stuInfoEn) Return True End If End Function End Class
其實B層發揮的做用其實很大,對數據加工在上面的代碼中沒有很好的體現,只是對D層返回的數據進行了簡單的判斷。這裏B層實例化了D層中的類sqlDAL ,調用了它的IsExit()和AddStu()方法,就這樣引用了D層,完成了本身的業務邏輯。cmd
不管B層的邏輯簡單仍是複雜,都妨礙不了D層,它只專一與對數據庫數據的操做。it
Imports StuEntity Public Class SqlDAL Public Function AddStu(ByVal stuinfoen As StuEntity.StudentEntity) As Boolean '根據傳入的參數StudentEntity,執行 數據庫 插入命令 並返回布爾值 Dim con As SqlClient.SqlConnection Dim cmd As SqlClient.SqlCommand Dim intResult As Integer con = New SqlClient.SqlConnection(ContactDAL.SqlString()) ‘創建對數據庫的鏈接 cmd = con.CreateCommand() cmd.CommandText = "insert into T_Names (ID,Name,Tel) values (" & stuinfoen.StuID & ",'" & stuinfoen.StuMarks & "'," & stuinfoen.StuTel & ")" ’對數據中數據操做的具體SQL語句 cmd.CommandType = CommandType.Text con.Open() ‘打開對數據庫的鏈接 intResult = cmd.ExecuteNonQuery() ,執行SQl語句,並返回執行結果 If intResult < 0 Then ,若是操做成功,則返回True,失敗則返回False Return True Else Return False End If con.Close() ’關閉鏈接, con = Nothing ,清楚存儲 End Function Public Function IsExist(ByVal stuinfoen As StuEntity.StudentEntity) As Boolean '根據傳入的參數StudentEntity,執行數據查詢命令,檢查是否有要檢索的內容 Dim con As SqlClient.SqlConnection = New SqlClient.SqlConnection(ContactDAL.SqlString()) Dim cmd As SqlClient.SqlCommand Dim dalReader As SqlClient.SqlDataReader cmd = con.CreateCommand cmd.CommandText = "select *from T_Names where ID='" & stuinfoen.StuID & "'" cmd.CommandType = CommandType.Text con.Open() dalReader = cmd.ExecuteReader() If dalReader.HasRows = True Then Return True Else Return False End If con.Close() con = Nothing End Function End Class
三層之間U層引用B層,B層引用D層這樣一個機制就這樣構成了。
這裏不得再也不提一下這個實體層StuEntity,它存在於三層架構以外,但它的存在大大幫助了三層的實現,由於在層與層之間的調用上須要傳遞一些參數,實體類剛好就是這樣一個裝載參數的容器。經過上面的代碼也能夠看出,三個層中都引用到了實體類,並且主要用於儲存和傳遞參數。如下是實體層的構建:
'定義實體類,存儲數據表T_Names中的數據 Public Class StudentEntity '聲明私有字段 Private _StuID As Integer Private _StuMark As String Private _StuTel As Integer Property StuID As Integer '定義StuId屬性 Get Return _StuID End Get Set(value As Integer) _StuID = value End Set End Property Property StuMarks As String '定義StuMarks屬性 Get Return _StuMark End Get Set(value As String) _StuMark = value End Set End Property Property StuTel As Integer '定義StuTel屬性 Get Return _StuTel End Get Set(value As Integer) _StuTel = value End Set End Property End Class
這是我對三層的理解,這個小例子的製做讓我對三層有了進一步的瞭解,其中還有些誤差,還望各位讀者多多指出,相互交流,共同進步。