之前学习对三层有了一个初步的了解,后面就需要实践来完成这件事情了,关于三层登陆主要是敲了两版,一版是根据视频中的讲解来完成的C#,另一版当然就是照着葫芦画瓢了,完成的Vb.net版。虽然是两种语言,但是其中的内容都是一致的,一个原则思路清晰,其余的东西都是so easy!
三层主要分为表示层,业务逻辑层,以及数据访问层。这个的目的主要是在于解耦合。还是先看看我的解决方案吧。
记得在第一版的机房收费系统中,每一个窗体都需要涉及到大量的数据,一个数据参数的遗漏都是一次艰难的挑错之旅。而利用三层实现登陆的最大好处就是用实体对其进行封装。这样每一次的参数传递都是在这个基础上实现的。下面请看
'********************************************** ' 文 件 名: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
<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!
菜鸟一只,如有不正确之处,还请各位大神斧正,不胜感激!