C#版的三层登陆实例,只是为了学习三层而实现的。为了接下来需要进行的vb.net版机房收费系统。根据上次的C#改编的vb.net版本登陆实例。不过在验收的时候发现了很多问题,所以进行了修改。
花费好几天的时间,终于从C#转化成了vb.net版本。期间参考了一些师哥师姐的博客来理解三层是如何交互的。
起初上一篇实例,并不是很懂,只是理解了个大概。然后根据那么多材料来进行对比。终于看懂他们是怎么进行操作的。就说看了那么多不同样式的实例之后,才知道谁的设计方案更好。知识是不变的,但是设计理念就能看出代码执行效率的高低。
在使用三层的过程中,才能真正体会到,什么叫高内聚,低耦合。在程序发现错误之后,能把错误的细节定位到具体一层,甚至具体一类。仅仅修改或更换这一类就能调试出来。使得调试代码的量变的极底。这就是使用三层的好处吧。
以下是本实例的设计,这个实例是模仿上篇实例得到的。所以名称有些不规范,请见谅。
数据库还是使用的上次的数据可,没有变动。
通过对实例的不断分解,单一职责划分。得到下图的引用关系。
接下来看一下各个层次的代码:
UI层:
- Public Class Form1
- Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
- Try
- Dim user1 As New Login.Moudel.UserInfoEntity
- Dim user2 As New Login.Moudel.UserInfoEntity '使用user2来进行登陆
- user2.USERNAME = txtUserName.Text.Trim
- user2.PASSWORD = txtPassword.Text
- Dim mgr As New Login.BLL.LoginManager
- user1 = mgr.SelectUserLogin(user2) '将登陆返回的结果存放到user1中
- MessageBox.Show("登陆用户:" + user1.USERNAME) '通知用户登陆成功
- Catch ex As Exception
- MessageBox.Show(ex.Message.ToString()) '登陆失败,通知用户
- End Try
- End Sub
- '退出系统
- Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click
- End
- End Sub
- End Class
B层:
- Public Class LoginManager
- Function SelectUserLogin(ByVal User As Login.Moudel.UserInfoEntity) As Login.Moudel.UserInfoEntity
- Dim bUser As LoginIDAL.IUser
- bUser = Factory.DataAccess.CreateUser()
- Dim rUser As New Login.Moudel.UserInfoEntity '定义一个数据实体
- rUser = bUser.SelectUser(User) '根据参数 查找数据库 并返回一个实体
- If IsNothing(rUser.USERNAME) Then '判断用户名是否存在
- Throw New Exception("用户名 不存在")
- End If
- If rUser.PASSWORD = User.PASSWORD Then '判断密码是否正确
- Return rUser
- Else
- Throw New Exception("登陆失败,请检查用户名密码")
- End If
- End Function
- End Class
D层:
- Public Class DbConnStr
- Public Shared Function Connstring() As String
- Connstring = "Server=zc-pc;Database=UBDLogin;User ID=sa; Password=123456"
- End Function
- End Class
- Imports System.Data.SqlClient
- Imports System.Data
- Public Class SqlServerDAO : Implements LoginIDAL.IUser
- Function SelectUser(ByVal user As Login.Moudel.UserInfoEntity) As Login.Moudel.UserInfoEntity Implements LoginIDAL.IUser.SelectUser
- Dim conn As New SqlConnection '创建链接对象
- Dim cmd As New SqlCommand '创建命令对象
- conn = New SqlConnection(DbConnStr.Connstring()) '链接数据库
- cmd.Connection = conn
- cmd.CommandText = "Select * from Users Where UserName=@UserName" ' and Password=@Password"
- cmd.Parameters.Add(New SqlParameter("@UserName", user.USERNAME))
- 'cmd.Parameters.Add(New SqlParameter("@Password", user.PASSWORD))
- cmd.CommandType = CommandType.Text
- conn.Open()
- Dim reader As SqlDataReader = cmd.ExecuteReader '执行生成一个dataReader
- Dim rUser As New Login.Moudel.UserInfoEntity '用于保存返回实体
- While (reader.Read())
- rUser.USERNAME = reader.GetString(1)
- rUser.PASSWORD = reader.GetString(2)
- rUser.LEVEL = reader.GetString(3)
- rUser.EMAIL = reader.GetString(4)
- End While
- Return rUser '返回取出得到的实体
- conn.Close()
- End Function
- End Class
IDAL:
- Public Interface IFactory '工厂类
- Function CreateUser() As LoginIDAL.IUser
- End Interface
- Public Interface IUser
- Function SelectUser(ByVal user As Login.Moudel.UserInfoEntity) As Login.Moudel.UserInfoEntity
- End Interface
Entity:
- Public Class UserInfoEntity
- Private _userID As String
- Private _userName As String
- Private _password As String
- 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
总结:三层架构,只是一种设计理念。帮助我们来优化代码,降低代码之间的耦合。仅仅通过几天的学习,是不可能全部掌握的。这种东西,就好比学习 面向对象的 思想, 需要在长期的实践 应用中,才能体会到里面的精髓。