首页 > 代码库 > 三层,你真的理解了吗?

三层,你真的理解了吗?

  这篇博客,在草稿箱存了很久,直至今日才准备发表。为什么呢?刚开始写这个博客的时候是三层登录刚刚实现。代码是借鉴的网上大神的,只是实现了简单的登录功能。知道它有三个层,每层是干吗的,理解也仅仅局限于官方的解释。也就是下面的这些东东:


  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!当初大部分时间还是花在不愿意动脑,纠结犹豫上面了。还有做事之前一定要考虑,执行一个番茄的目的,目标不明确,就不要怪自己在别的地方留恋太久了。