上篇博客,我们学习了有关三层的一些理论知识。有关UI用户显示层、BLL业务逻辑层、DAL数据访问层,
Model层还有疑惑的小伙伴请戳【VB.net】三层的理论认识。
本篇博客是关于VB.net三层登陆功能的代码实现。希望能给你带来一些收获,不足之处,希望你能在评论
里留下宝贵建议。❤
第一步:
我们还是看这张有关三层的包图,再次明确,三层之间的引用关系——U层引用了B层和Entity,B层引用了
D层和Entity,D层引用了Entity。(Entity就是下文的LoginModel 是模型实体的意思)
第二步:
打开VS2012,新建解决方案之后,我们要新建项目,语言选择是Visual Basic。除了LoginUI是Windows
窗体类型之外,其它的LoginBLL,LoginDAL,LoginModel(Entity)都是类库类型。
举个栗子:
例如下图是D层的根命名空间的修改。
D层的根命名空间未修改之前和程序集“LoginDAL”是一模一样的。我们需要在 Login和DAL之间加一个点,变 为Login.DAL。(Do you know why?)
按照上述方法,给B层,U层,Model层修改完成后,我们的解决方案就成型啦。
下图为我的解决方案。
第三步:引用贴士
各层之间的引用要正确。Don't forget it!
向上滚动滑轮,看好第一张三层的包图。
举个栗子:
以U层为例,我们看看如何添加引用。
U层要引用B层和LoginModel。我们就右击LoginUI——>添加引用——>给要引用的解决方案里的项目前打上对勾。
其它的B层,D层大家自己动手尝试一下吧!(LoginModel是不要引用其它项目的,Do you know why?)
另外,我们下面的代码中也有涉及到引用。
第四步:各层代码的实现
1.从包含基础信息的LoginModel开始。
LoginModel:
- Public Class UserInfo
- '数据模型的信息,姓名 ID 密码
- Private T_UserName As String
- Public Property UserName() As String
- Get
- Return T_UserName
- End Get
- Set(ByVal value As String)
- T_UserName = value
- End Set
- End Property
- Private T_ID As Int32
- Public Property ID() As Int32
- Get
- Return T_ID
- End Get
- Set(ByVal value As Int32)
- T_ID = value
- End Set
- End Property
- Private T_Password As String
- Public Property Password() As String
- Get
- Return T_Password
- End Get
- Set(ByVal value As String)
- T_Password = value
- End Set
- End Property
- End Class
2.下面该是数据库D层了,我们首先要做好的工作就是,要建立好数据库,以及新建一张用户表,在表中添加一则
用户信息。
- Imports System.Data.sqlClient
- Public Class DBUtil
- '定义ConnString函数为数据库连接
- Public Shared Function ConnString() As sqlConnection
- Dim cnStr As String
- '连接数据库需要的信息赋值给字符串cnStr
- cnStr = "Server=LOUISE; Database=VB.net Login; User ID=sa; Password=12"
- Dim cn As sqlConnection '定义cn为一个数据库连接
- cn = New sqlConnection(cnStr) '实例化一个连接
- Return cn '返回这个连接
- End Function
- End Class
- Imports System.Data.sqlClient
- Imports System.Data
- Public Class UserDAO
- '定义选择用户函数,user参数为model里的数据模型
- Public Function SelectUser(ByVal user As Login.Model.UserInfo) As Login.Model.UserInfo
- Dim cn As sqlConnection = DBUtil.ConnString
- Dim sql As String
- 'sql为连接数据库的字符串
- sql = "SELECT * FROM T_Users WHERE UserID=@UserID AND Password=@Password"
- Dim cmd As sqlCommand = New sqlCommand(sql,cn) '定义一个sqlcommand函数用来传递参数信息
- cmd.Parameters.Add(New sqlParameter("@UserID",user.UserName))
- cmd.Parameters.Add(New sqlParameter("@Password",user.Password))
- cn.Open() '连接打开
- Dim reader As sqlDataReader '定义读取数据库信息的reader
- reader = cmd.ExecuteReader 'sqlcommand函数执行reader赋值给reader
- Dim uuser As New Login.Model.UserInfo
- While (reader.Read())
- uuser.ID = reader.GetString(0)
- uuser.UserName = reader.GetString(1)
- uuser.Password = reader.GetString(2)
- End While
- Return uuser
- End Function
- End Class
3.下面紧接着我们来看看,B层的LoginManager(登陆业务逻辑)代码:
- Public Class LoginManager
- '公共函数UserLogin,定义一个实体层User
- Public Function UserLogin(ByVal User As Login.Model.UserInfo) As Login.Model.UserInfo 'user 什么意思?
- Dim uDAO As New Login.DAL.UserDAO 'B层需要引用D层数据库
- Dim uuser As Login.Model.UserInfo 'B层引用Entity,定义一个uuser
- uuser = uDAO.SelectUser(User)
- If IsNothing(uuser) Then
- Throw New Exception("登陆失败,请重新登陆。")
- Else
- If IsNothing(uuser.Password) Then
- Throw New Exception("登陆失败,请输入密码。")
- Else
- MsgBox("恭喜你,登陆成功啦!")
- Return uuser '返回user实体
- End If
- End If
- End Function
- End Class
- Public Class frmLogin
- Private Sub btnLogin_Click(sender As Object,e As EventArgs) Handles btnLogin.Click
- Dim manager As New Login.BLL.LoginManager
- Dim user As New Login.Model.UserInfo
- user.UserName = txtUserName.Text.Trim
- user.Password = txtPassword.Text
- manager.UserLogin(user)
- End Sub
- Private Sub frmLogin_Load(sender As Object,e As EventArgs) Handles MyBase.Load
- Me.AcceptButton = btnLogin
- End Sub
- End Class
本文小结:
以上是三层的全部代码实现,注释有待提高,三层的理解也在机房重构里愈来愈多。
层层架构,对于程序,对于代码,对于我们都是一个新征程的开始!Keep fighting!