三層,你真的理解了嗎?

ZeroWM發表於2014-08-03

  這篇部落格,在草稿箱存了很久,直至今日才準備發表。為什麼呢?剛開始寫這個部落格的時候是三層登入剛剛實現。程式碼是借鑑的網上大神的,只是實現了簡單的登入功能。知道它有三個層,每層是幹嗎的,理解也僅僅侷限於官方的解釋。也就是下面的這些東東:


  UI(view):顯示層,只負責顯示和採集使用者操作,不包含任何的業務相關的邏輯處理。

  BLL(Business Logic Layer):業務邏輯層,通過獲取UI傳來的操作指令,決定執行業務邏輯,在需要訪問資料來源的時候直接交給DAL處理。處理完成後,返回必要資料給UI.

  DAL(Data Access Layer):資料訪問層,只是提供基本的資料訪問,不包含任何業務相關的邏輯處理。


  看見了之後,頭都大了,說的不錯,但是反應到程式碼裡面到底是怎麼個樣子嗎?不懂啊~~~所以這篇文章,直到今天,才得以重見天日。

  現在對它的理解稍稍好了那麼一點,下面讓大家看看他們之間的對話,看看哪個人說錯了,拉出去槍斃!


  UI層說:要想登入就必須要驗證使用者,要麼成功,要麼失敗!


UI層程式碼:

<span style="font-size:18px;">Public Class frmLogin

    Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
        Dim LUser As New Entity.User  '例項化LUser為實體層使用者
        Dim BCheck As New BLL.BllLogin '定義BCheck為B層的登陸方法

        LUser.ID = txtUserID.Text
        LUser.Password = txtPwd.Text


        If BCheck.Check(LUser) = True Then
            MsgBox("登入成功!")
        Else
            MsgBox("登入失敗!")

        End If

    End Sub

    Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click
        End
    End Sub
End Class
</span>


    BLL層說:好的,我告訴你驗證使用者的方法,就是比較介面輸入的使用者名稱和密碼跟資料庫中提取出來的資料是否一致。


B層程式碼:

<span style="font-size:18px;">Public Class BllLogin
    Function Check(ByVal User As Entity.User) As Boolean
        Dim DaUser As New DAL.DalUserInfo '定義DaUser為D層的使用者資訊
        Dim BlUser As New Entity.User

        BlUser.ID = User.ID 'B層引用的D層的User.ID
        BlUser = DaUser.Check(BlUser) 'bll層對Dal層的判斷方法
        '判斷密碼是否跟實體層的密碼是否一致
        If BlUser.Password = User.Password Then
            Return True
        Else
            Return False
        End If
    End Function
End Class</span>


  DAL層說:你們跟我說,想要什麼資料,我拿鑰匙去資料庫裡面取。


DAL層程式碼:

<span style="font-size:18px;">Imports System.Data.SqlClient '名稱空間

Public Class DalUserInfo
    '聯接資料庫,ConnStr用來初始化Connection物件 initial Catalog是要聯接的資料庫的名字
    Dim ConnStr As String = "Data Source=192.168.24.175;Initial Catalog=Login ;User ID=sa;Pwd=123456"
    Dim conn As SqlConnection = New SqlConnection(ConnStr) '建立聯接物件

    Function Check(ByVal User As Entity.User) As Entity.User
        '資料庫查詢語句

        Dim sql As String = "select * from UserInfo where ID='" & User.ID & "'"
        Dim cmd As SqlCommand = New SqlCommand(Sql, conn)
        Dim read As SqlDataReader
        Try '先執行try裡面的語句,如果出現錯誤,就馬上跳入Catch中

            conn.Open() '開啟聯接
            read = cmd.ExecuteReader '返回型別為SqlDataReader,此方法用於查詢操作
            read.Read()

            User.ID = read.Item("ID")
            User.Password = read.Item("Password")
            Return User
        Catch ex As Exception

            User.Password = ""
            Return User
        End Try
    End Function

End Class</span>


  Entity層說:UI層、DAL層、BLL層,沒有我這傳聲筒,你們去哪找個具體的物件來練手~


Entity層程式碼:

<span style="font-size:18px;">
Public Class User
    Private userID As String '定義一個私有變數userID為字串型別
    Private userPwd As String '定義一個私有變數userPwd為字串型別


    Public Property ID() As String
        Get’讀
            Return userID
        End Get
        Set(value As String)’寫
            userID = value
        End Set
    End Property

    Public Property Password() As String
        Get
            Return userPwd
        End Get
        Set(value As String)
            userPwd = value
        End Set
    End Property


End Class
</span>


  總之我們的UI層主外,就像老闆,負責攬活和交活。BLL層就是比較專業一些了,就像設計師,UI層從外面攬的活,他來做邏輯上的處理,進行出謀劃策,提供建造圖紙。DAL層就比較辛苦了,就像工人,聽從組織安排,整天跟磚頭水泥打交道,幹活就行,啥操心的活都讓BLL層處理去吧。


  這次的理解到不了爐火純青的地步,但是似乎比剛開始的生搬硬套好了那麼一些。現在發現自己還是一個膽小鬼,當初只要踏踏實實的把註釋寫好,把各個層的程式碼,程式碼和功能放到一起進行對比理解,搞懂程式碼和功能之間的對應關係,絕對是so easy!當初大部分時間還是花在不願意動腦,糾結猶豫上面了。還有做事之前一定要考慮,執行一個番茄的目的,目標不明確,就不要怪自己在別的地方留戀太久了。





相關文章