七层登录实现也有一段时间了,觉得一直处在迷茫的时期。理清思路其实看起来七层也是很简单的。在开始登录代码实现之前,先画了登录窗体的包图,宏观上对于七层登录有一个把控。
首先说一下包图的简单作用:包图可以描述需求,设计的高阶概况。包图通过合理规划自身功能反应系统的高层架构,在逻辑上将系统进行模块化分解;包图最终是组织源码的方式。
七层其实还是可以看成八层的,D层其实还可以抽出sqlHelper来。在这里我将其并入到D层,同样都是对于数据库中数据的处理。下面分别来介绍七层结构。
首先,七层结构要说的肯定是实体层。实体很多层中间参数的传递都是通过他,三层时有了解不再赘述。
因为代码比较简单这里就直接省略了。
登录功能的实现最先调用的就是U层,也就是界面层。UI负责与用户交互,负责数据的输入和输出。在登录功能中有一个重要功能就是传参(通过实体)。
Imports Entity '添加实体引用
Imports Facade
Public Class frmLogin
Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click
Dim eUser As New Entity.LoginEntity '定义一个新的实体存放数据
eUser.UserID = txtUserName.Text.Trim '将文本框中的内容传入到实体中。
eUser.PassWord = txtPassWord.Text.Trim
If txtUserName.Text.Trim() = "" Then '判断用户名是否为空
MessageBox.Show("请输入用户名", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
txtUserName.Select()
txtUserName.Focus()
Exit Sub
ElseIf IsNumeric(txtUserName.Text) = False Then '判断用户名是否为数字。只能是数字
MsgBox("用户名请输入数字")
txtUserName.Text = ""
txtUserName.Select()
txtUserName.Focus()
Exit Sub
ElseIf txtPassWord.Text.Trim() = "" Then '判断密码框知否为空,如果为空就提示。
MessageBox.Show("请输入密码", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
txtPassWord.Select() '
txtPassWord.Focus() '密码框获得焦点
Exit Sub
End If
Try '用来捕捉错误
Dim LoginFacade1 As New Facade.LoginFacade '定义外观层,外观用于解耦。
Dim strResult1 As Boolean '将U层的信息传入外观层,然后再由外观层传入B层进行判断
strResult1 = LoginFacade1.CheckUserName(eUser) 'strresult1是外观层中的定义的函数。
If strResult1 = False Then '如果传回的参数是false则证明并未查到该用户
MessageBox.Show("用户名或密码错误")
txtUserName.Text = ""
txtPassWord.Text = ""
txtUserName.Focus()
Else '用户存在且密码正确。
MessageBox.Show("登录成功")
End If
Catch ex As Exception
MsgBox(ex.Message)
txtUserName.Text = ""
txtPassWord.Text = ""
txtUserName.Focus()
End Try
End Sub
Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click
End
End Sub
在三层结构中U层和B层的耦合性太强,加入外观层之后。U层不再和B层直接交互,而是和外观层进行交互,将用户信息从外观层导入B层进行信息处理,这样在对U层或B层改动时减少互相影响,降低了耦合度。主要是对方法的封装,但还是调用的B层的方法,不过让数据在外观层走一遍。
Imports BLL
Imports Entity
Public Class LoginFacade
Public Function CheckUserName(ByVal eUser As Entity.LoginEntity) As Boolean '一个Boolean类型的方法
'用于检查用户是否存在,密码是否正确。
Dim CheckUserBLL As New BLL.LoginBLL '实例化一个B层,
Dim flag As Boolean
flag = CheckUserBLL.CheckUser(eUser) 'flag是B层中定义的自定义函数
If flag = True Then '如果在B层中的方法返回值为true则返回true
Return True
Else
Return False
End If
End Function
End Class
主要是对数据逻辑的处理,对于外观层传来的信息进行处理判断。另一方面接受工厂和D层传来的信息。
Imports Entity
Imports IDAL
Public Class LoginBLL
'检查用户是否存在
Public Function CheckUser(ByVal eUser As Entity.LoginEntity) As Boolean '定义一个函数在B层中
'实例化一个工厂
Dim factory As New Factory.LoginFactory
'定义一个变量接口
Dim IUser As IDAL.IUser '实例化一个新的接口
IUser = factory.CreateUser '通过接口调用创建用户的工厂方法
Dim table As DataTable '定义一个临时的数据表,存放用户表中的数据
Dim flag As Boolean '定义一个boolean的变量,用来返回是否查询到了用户。
table = IUser.CheckUser(eUser) 'table等于接口自定义函数返回的值。
If table.Rows.Count = 0 Then '查询临时表中的数据,如果没有在表中查询到数据,证明该用户不存在或者密码错误
flag = False '返回false
Else
flag = True '否则返回true
End If
Return flag
End Function
End Class
Imports System.Configuration
Imports IDAL
Imports System.Data
Imports System.Reflection
Public Class LoginFactory
Public ReadOnly strDB As String = Configuration.ConfigurationSettings.AppSettings("DB") '读配置文件,确定打开的是SQL数据库
Public Function CreateUser() As IUser
Return CType(Assembly.Load("DAL").CreateInstance("DAL" & "." & "LoginDAL"), IUser) '
End Function
End Class
'定义一个解耦B层和D层的接口。
Imports Entity
Public Interface IUser
'检查用户是否存在,如果存在检查密码是否正确。
Function CheckUser(ByVal eUser As Entity.LoginEntity) As DataTable
End Interface
Imports System.Data.SqlClient
Imports IDAL '
Imports Entity
Imports sqlHelper
Public Class LoginDAL : Implements IDAL.IUser '实现了接口
Private sqlHelper As New sqlHelper.LoginsqlHelper '实例化了一个新的sqlHelper
'判断用户是否存在
Public Function SeletExistsUser(eUser As LoginEntity) As DataTable Implements IUser.CheckUser
Dim sql As String '中间变量,用于存储从数据库中查到的信息
Dim table As DataTable '声明并实例化参数数组
Dim sqlParams As SqlParameter() = {New SqlParameter("@UserID", eUser.UserID),
New SqlParameter("@Password", eUser.PassWord)} '赋值语句。传参数
sql = "select * from User_Info where UserID=@UserID and PWD=@Password" '查询数据库中的是否和参数的值相同
table = sqlHelper.ExecSelect(sql, CommandType.Text, sqlParams) '临时表中存放数据
Return table
End Function
End Class