之前学习对三层有了一个初步的了解,后面就需要实践来完成这件事情了,关于三层登陆主要是敲了两版,一版是根据视频中的讲解来完成的C#,另一版当然就是照着葫芦画瓢了,完成的Vb.net版。虽然是两种语言,但是其中的内容都是一致的,一个原则思路清晰,其余的东西都是so easy!

    三层主要分为表示层,业务逻辑层,以及数据访问层。这个的目的主要是在于解耦合。还是先看看我的解决方案吧。

                

【浅谈三层】——三层登陆_数据


    记得在第一版的机房收费系统中,每一个窗体都需要涉及到大量的数据,一个数据参数的遗漏都是一次艰难的挑错之旅。而利用三层实现登陆的最大好处就是用实体对其进行封装。这样每一次的参数传递都是在这个基础上实现的。下面请看

实体层Modal


'**********************************************
' 文 件 名:UserInfoModal
' 命名空间:Login.Modal
' 内 容:
' 功 能:
' 文件关系:
' 作 者:贾文静
' 小 组:XX
' 生成日期:2015/11/23 16:24:18
' 版 本 号:V1.0.0.0
' 修改日志:
' 版权说明:
'**********************************************
Public Class UserInfoModal
Private _UserName As String
Private _UserID As String
Private _Password As String
Public Property UserID() As String
Get
Return _UserID
End Get
Set(value As String)
_UserID = value
End Set
End Property
Public Property UserName() As String
Get
Return _UserName
End Get
Set(value As String)
_UserName = value
End Set
End Property
Public Property Password() As String
Get
Return _Password
End Get
Set(value As String)
_Password = value
End Set
End Property
End Class

表示层U层

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

Private Sub btnOk_Click(sender As Object, e As EventArgs) Handles btnOk.Click
Try
Dim manager As New Login.BLL.Loginmanager
Dim User As New Login.Modal.UserInfoModal
User.UserName = txtUserName.Text.Trim
User.Password = txtPassword.Text.Trim

manager.UserLogin(User)
'MessageBox.Show("登陆成功" + User.UserName)
Catch ex As Exception
MessageBox.Show(ex.Message.ToString())
End Try

End Sub
End Class</span>

U层比较简单,它只是复杂和用户界面的交互,读取基本的数据然后传到B层。

业务逻辑层


'**********************************************
' 文 件 名:Loginmanager
' 命名空间:Login.BLL
' 内 容:
' 功 能:
' 文件关系:
' 作 者:贾文静
' 小 组:XX
' 生成日期:2015/11/23 16:51:32
' 版 本 号:V1.0.0.0
' 修改日志:
' 版权说明:
'**********************************************
Public Class Loginmanager
Public Function UserLogin(ByVal user As Login.Modal.UserInfoModal) As Login.Modal.UserInfoModal
Dim UserDao As New Login.DAL.UserInfo
Dim buser As New Login.Modal.UserInfoModal
buser = UserDao.SelectUser(user)

If IsNothing(buser) Then
Throw New Exception("登陆失败,请检查登陆用户名")
Else
If IsNothing(buser.Password) Then
Throw New Exception("登陆失败,请检查密码")
Else
MsgBox("恭喜您,登陆成功")
Return buser '返回mUser1实体
End If
End If
End Function
End Class

B层不涉及到数据的操作,只是对U层传进来的内容通过selectUser传给D层进行数据的判断。

数据访问层

SQLUntil


'**********************************************
' 文 件 名:sqlUntil
' 命名空间:LoginDAL
' 内 容:
' 功 能:
' 文件关系:
' 作 者:贾文静
' 小 组:XX
' 生成日期:2015/11/23 16:18:37
' 版 本 号:V1.0.0.0
' 修改日志:
' 版权说明:
'**********************************************
Imports System.Data.SqlClient
Public Class sqlUntil
Public Shared Function Connstring() As SqlConnection
Dim cnStr As String

cnStr = "Server=(local); Database=JF; User ID=sa;Password =1"
Dim cn As SqlConnection
cn = New SqlConnection(cnStr)
Return cn
End Function
End Class

UserInfo

<span style="font-size:24px;">'**********************************************
' 文 件 名:UserInfo
' 命名空间:Login.DAL
' 内 容:
' 功 能:
' 文件关系:
' 作 者:贾文静
' 小 组:XX
' 生成日期:2015/11/23 16:35:36
' 版 本 号:V1.0.0.0
' 修改日志:
' 版权说明:
'**********************************************
Imports System.Data.SqlClient
Public Class UserInfo
Public Function SelectUser(ByVal user As Login.Modal.UserInfoModal) As Login.Modal.UserInfoModal
Dim cn As SqlConnection = sqlUntil.Connstring
Dim sql As String
sql = "SELECT UserName,Password FROM User_Info WHERE UserName=@UserName AND Password=@Password"
Dim cmd As SqlCommand = New SqlCommand(sql, cn)

cmd.Parameters.Add(New SqlParameter("@UserName", user.UserName))
cmd.Parameters.Add(New SqlParameter("@Password", user.Password))

cn.Open()
Dim reader As SqlDataReader
reader = cmd.ExecuteReader
Dim bUser As New Login.Modal.UserInfoModal
While (reader.Read())
bUser.UserName = reader.GetString(1)
bUser.Password = reader.GetString(2)
End While
Return bUser
End Function
End Class</span>

通过B层传进来的实体,连接数据库,然后调用数据库中的数据,进行判定,将得出的实体传回B层和U层传进的实体进行对比,将结果返回U层。登陆整个过程结束!

【总结】

    有时候话说千百遍不如实现一次,通过对代码的调试,更能体会其中的数据传递过程。用它对比第一版的机房收费系统,会发现层次突然就明晰了。第一次的VB版所有的数据连接都在模块中。而这次看似麻烦的分层其实就是一个简化的过程,思路清晰了,一切都变得OK!

      菜鸟一只,如有不正确之处,还请各位大神斧正,不胜感激!