上篇部落格簡單介紹了下三層架構,看着很簡單,無非是功能去分層實作,每層有每層的職責,讓資料在三層之間來回傳輸就可以了,進而更好地解耦,但是作為一個小小小菜鳥,一旦實際使用還是很傷腦筋的,下面以使用者登入為例,來看看三層架構是如何被應用的。
UI層
向使用者展現特定的資料,采集使用者的輸入資訊和操作,與使用者進行互動。
Public Class Form1
Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
Dim manager As New LoginBLL.LoginManager '執行個體化并引用
Dim user As New LoginModel.UserInfo
user.UserName = txtUserName.Text.Trim '給實體層指派
user.Password = txtPassword.Text
manager.UserLogin(user) '調給B層并判斷
MessageBox.Show("登入使用者" + user.UserName)
End Sub
End Class
BLL層
BLL層是三層架構的核心,業務邏輯放到這一層,相當于資料的中轉站了,分别從UI層和DAL層擷取使用者資訊和資料資訊,然後再回饋給這兩層。
Public Class LoginManager
Public Function UserLogin(ByVal user As LoginModel.UserInfo) As LoginModel.UserInfo
Dim uDao As New LoginDAL.UserDAO '執行個體化D層中UserDAO對象
Dim Uuser As New LoginModel.UserInfo '定義實體層參數用來指派
Uuser = uDao.SelectUser(user) '将實體user傳給D層
If IsNothing(Uuser.UserName) Then
Throw New Exception("登入失敗")
Else
MsgBox("登陸成功")
End If
Return Uuser '将實體user傳回到U層
End Function
End Class
DAL層
這一層就是和資料庫打交道了,執行資料庫資訊的增删改查。
Imports System.Data.SqlClient
Public Class UserDAO
Public conn As New SqlConnection("Server=DESKTOP-5KMOCVI;Database=Login;User ID=sa;Password=123") '連接配接資料庫
Public Function SelectUser(ByVal user As LoginModel.UserInfo) As LoginModel.UserInfo '傳實體UserInfo以便參數調用
Dim sql As String = "SELECT ID,UserName,Password FROM USERS WHERE [email protected] AND [email protected]" 'SQL查詢語句
Dim cmd As New SqlCommand(sql, conn) '構造方法,執行和連接配接
'增加兩個參數@UserName、@Password
cmd.Parameters.Add(New SqlParameter("@UserName", user.UserName))
cmd.Parameters.Add(New SqlParameter("@Password", user.Password))
conn.Open() '打開資料連接配接
Dim reader As SqlDataReader = cmd.ExecuteReader '定義類型為sqlDatareader的變量reader,并執行SQL語句
Dim Buser As New LoginModel.UserInfo '執行個體化新的UserInfo
'使用SqlDataReader對象Read()方法進行逐行讀取
While (reader.Read())
Buser.UserName = reader.GetString(1) '擷取第一列中的資料
Buser.Password = reader.GetString(2) '擷取第二列中的資料
End While
Return Buser '傳回對象
conn.Close() '關閉資料連接配接
End Function
End Class
實體層
資料那麼多,當然得定義一個實體來封裝資料啦,用以在三層之間來回調用。
Public Class UserInfo
Private _username As String '封裝一些屬性,用來在三層之間傳輸資料
Public Property UserName As String
Get
Return _username
End Get
Set(value As String)
_username = value
End Set
End Property
Private _password As String
Public Property Password As String
Get
Return _password
End Get
Set(value As String)
_password = value
End Set
End Property
End Class
各層之間的引用:UI引用BLL,BLL引用DAL,Model被這仨都引用,除此之外沒引用關系喽。
小結
這隻是對三層架構的一個小小應用,對系統的分層展現了“高内聚,低耦合”的思想,然而這隻是一個小小的起步,因為後面還有加了設計模式的七層~~小小小菜鳥,還得繼續加油啊!