机房重构——七层登录

【前言】

七层登录可真是历经千辛万苦呀,不过现在已经实现了,心情还是开心的不要不要滴。

【正文】

Why?

七层其实就是在三层的基础上又加了四层,主要就是为了解耦,使各层之间的数据不是直接的连接,而是通过七层传递。

What?

UI层:接收和显示用户的需求,将参数传递给外观层。

Facade层:传递参数,将UI层与BLL层分离。其实就是用了一个外观模式,作用就是解除B层与U层之间的耦合

BLL层:主要业务的判断和处理。

Factory层:使用抽象工厂+反射+配置文件,让数据库可以随时更换。以及将DAL层的类转换成IDAL层的接口实现,从而BLL层可以通过IDAL层访问DAL层。

IDAL:数据访问层,解耦BLL层和DAL层。就是提供接口

DAL层:数据层,对数据的增删改查。

Entity:实体层,贯穿于各层之间,联系各层。就是存储数据的,方便在各个层之间传递数据,多数作为类中方法的参数

SqlHelper层:主要是DAL的封装和抽象。

How?

先来看一下七层的包图

接下来看一下七层登录的时序图


接下来看一下实现的代码

U层

Public Class frmLogin
    Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
        '判断是否为空
        If txtUserName.Text = "" Then
            MsgBox("请输入用户名", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            txtUserName.Focus()
            Exit Sub '过程内 代码执行时 选择性的中途推出
        End If
        If txtPassWord.Text = "" Then
            MsgBox("请输入密码", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            Exit Sub
        End If
        If IsNumeric(txtPassWord.Text) = False Then
            MsgBox("请输入数字", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            Exit Sub
        End If

        Try
            Dim Facade As New Facade.LoginFacade
            Dim UserInfo As New Entity.LoginUserInfo
            UserInfo.UserName = txtUserName.Text.Trim()
            UserInfo.PassWord = txtPassWord.Text.Trim()
            Dim strResult As Boolean
            '将U层的用户信息传入外观层,然后通过外观层传入B层进行判断
            strResult = Facade.CheckUser(UserInfo)
            If strResult = False Then
                MsgBox("用户名不存在", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                txtUserName.Text = ""
                txtPassWord.Text = ""
                txtUserName.Select()
                txtUserName.Focus()
                Exit Sub
            End If

            Dim table As DataTable
            table = Facade.CheckPWD(UserInfo)

            If Trim(txtPassWord.Text) = Trim(table.Rows(0).Item(1)) Then
                MsgBox("登录成功")
                Me.Hide()
                txtPassWord.Text = ""
                txtUserName.Text = ""
            End If
        Catch ex As Exception
            MsgBox("用户名或密码不正确")
            txtPassWord.Text = ""
            txtUserName.Text = ""
            txtUserName.Select()
            txtUserName.Focus()
            Exit Sub
        End Try
    End Sub '一个过程的退出

    Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click
        End
    End Sub
End Class
Facade层

Public Class LoginFacade
    '检查用户名是否存在
    Public Function CheckUser(ByVal UserInfo As Entity.LoginUserInfo) As Boolean
        Dim IsUserExists As New BLL.LoginBLL
        Dim flag As Boolean
        flag = IsUserExists.CheckUser(UserInfo)
        If flag = True Then
            Return True
        Else
            Return False
        End If
    End Function

    '检查密码是否存在
    Public Function CheckPWD(ByVal UserInfo As Entity.LoginUserInfo) As DataTable
        Dim IsPWDExists As New BLL.LoginBLL
        Dim table As DataTable
        table = IsPWDExists.CheckPWD(UserInfo)
        Return table
    End Function

End Class
BLL层

Public Class LoginBLL
    Public Function CheckUser(ByVal UserInfo As Entity.LoginUserInfo) As Boolean
        Dim Factory As New Factory.LoginFactory
        Dim IUser As IDAL.LoginIUserInfo
        '调用创建用户的工厂方法
        IUser = Factory.CreateIUser()
        Dim table As New DataTable
        Dim flag As Boolean
        table = IUser.selectUser(UserInfo)
        If table.Rows.Count = 0 Then
            flag = False
        Else
            flag = True
        End If

        Return flag
    End Function

    Public Function CheckPWD(ByVal UserInfo As Entity.LoginUserInfo) As DataTable
        Dim Factory As New Factory.LoginFactory
        Dim IUser As IDAL.LoginIUserInfo
        Dim table As DataTable

        IUser = Factory.CreateIUser
        table = IUser.selectUser(UserInfo)

        Return table

    End Function

End Class
Factory层

Imports System.Reflection '添加对 反射 的引用
Imports System.Configuration '添加对 配置文件 的引用
Imports System.Data
Imports IDAL '引用接口层

'反射+配置文件+抽象工厂实现数据访问

Public Class LoginFactory


    Private Shared ReadOnly AssemblyName As String = "DAL" '程序集名称
    '利用读配置文件可以更改数据库的类型
    Dim strDB As String = System.Configuration.ConfigurationSettings.AppSettings("DB")


    Public Function CreateIUser() As LoginIUserInfo
        Dim classmate As String = AssemblyName + "." + strDB + "LoginDAL" '要实例化的D层的类的名称
        Dim IUser As LoginIUserInfo
        'CType函数将返回表达式显示的转换为指定的数据类型、对象、结构、类、或接口后的结果
        IUser = CType(Assembly.Load(AssemblyName).CreateInstance(classmate), LoginIUserInfo) '返回LoginIUserInfo
        Return IUser
    End Function

End Class
IDAL层

Public Interface LoginIUserInfo
    '判断用户名是否正确
    Function selectUser(ByVal UserInfo As Entity.LoginUserInfo) As DataTable

End Interface
DAL层

Imports System.Data.SqlClient
Public Class LoginDAL : Implements IDAL.LoginIUserInfo
    '实现接口中方法
    Private sqlHelper As New SqlHelper.SqlHelper
    '判断用户是否正确
    Public Function selectUser(UserInfo As Entity.LoginUserInfo) As DataTable Implements IDAL.LoginIUserInfo.selectUser
        Dim sql As String '中间变量,用于存储从数据库中查找到的信息
        Dim table As DataTable
        '声明并实例化参数数组
        Dim sqlParams As SqlParameter() = {New SqlParameter("@userID", UserInfo.UserName), New SqlParameter("@PWD", UserInfo.PassWord)}
        sql = "Select * from User_Info where userID=@userID and PWD=@PWD"
        '调用SqlHelper类中的GetDataTable()方法来执行查询,并获取返回值  
        table = sqlHelper.ExecSelect(sql, CommandType.Text, sqlParams)

        Return table


    End Function
End Class
SqlHelper层

Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration

Public Class SqlHelper

    '数据库连接  
    Dim strConnection As String = "Server=qq;Database=JF;User ID=sa;Password=123456"
    Dim conn As New SqlConnection(strConnection)
    Dim cmd As New SqlCommand

    Public Function ExecSelect(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal paras As SqlParameter()) As DataTable
        Dim sqlAdapter As SqlDataAdapter
        Dim dt As New DataTable
        Dim ds As New DataSet
        '给cmd赋值  
        cmd.CommandText = cmdText
        cmd.CommandType = cmdType
        cmd.Connection = conn
        cmd.Parameters.AddRange(paras)  '参数添加  
        sqlAdapter = New SqlDataAdapter(cmd)  '实例化Adapter  
        Try
            sqlAdapter.Fill(ds)  'dataset填充adapter用 
            dt = ds.Tables(0)   'datatable为dataSet的第一个表   
            cmd.Parameters.Clear()  '清除参数  

        Catch ex As Exception
            MsgBox("数据库操作")
        Finally
            Call CloseCmd(cmd)  '销毁cmd命令  
        End Try

        Return dt

    End Function
    Public Sub CloseCmd(ByVal cmd As SqlCommand)
        If Not IsNothing(cmd) Then  '如果cmd命令存在  
            cmd.Dispose()           '销毁  
            cmd = Nothing
        End If
    End Sub

End Class
Entity层

Public Class LoginUserInfo
    Private _username As String
    Public Property UserName As String  '定义用户名属性
        Get
            Return _username
        End Get
        Set(value As String)
            _username = value
        End Set
    End Property

    Private _password As String
    Public Property PassWord As String   '定义密码属性
        Get
            Return _password
        End Get
        Set(value As String)
            _password = value
        End Set
    End Property
End Class

【总结】

七层的路刚刚开始,接下来还有很长一段时间要走,不过一条线走通了,以后就简单了。













  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 34
    评论
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值