【机房重构】——七层登陆

    前两篇文章主要是介绍了三层的登陆,但是前一段时间我们学过了设计模式,希望可以尝试着使用一下,根据需求,将两个设计模式添加到了三层登陆中,对程序架构进行进一步的解耦合!

    其实七层就是在原来三层的基础上添加了两个设计模式,一个是外观模式和抽象工厂模式,所以七层也不用害怕,只是将三层进行了扩充!图中的内容是个人理解,在这里要说明的是之前虽说是三成,但是实际是四层的,因为还有一个很重要的实体层。

          【机房重构】——七层登陆_第1张图片

 

关于七层之间实体的传递问题,一张图更能胜过前言万语!在图中大家要注意的时,接口层(IDAL)和数据访问层(DAL)是实现关系,并不是单纯的依赖关系。       【机房重构】——七层登陆_第2张图片

下面还是看看我的解决方案

                       【机房重构】——七层登陆_第3张图片

下面我就按照这个数据传递的顺序进行,给大家看一下我的代码部分。

最基础的部分实体层Entity

<span style="font-family:KaiTi_GB2312;font-size:24px;">'**********************************************
' 文  件  名:UserInfoEntity
' 命名空间:Entity
' 内       容:
' 功       能:
' 文件关系:
' 作       者:贾文静
' 小       组:XX
' 生成日期:2015/12/6 15:32:05
' 版  本  号:V1.0.0.0
' 修改日志:
' 版权说明:
'**********************************************
Public Class UserInfoEntity
#Region "定义变量"
    Public Shared ID As String
    Public Shared PSW As String
    Private _UserID As String
    Private _Password As String
    Private _UserName As String
    Private _Level As String
    Private _Holder As String
#End Region
    Public Property UserID() As String
        Get
            Return _UserID
        End Get
        Set(value As String)
            _UserID = 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
    Public Property UserName() As String
        Get
            Return _UserName
        End Get
        Set(value As String)
            _UserName = value
        End Set
    End Property
    Public Property Holder() As String
        Get
            Return _Holder
        End Get
        Set(value As String)
            _Holder = value
        End Set
    End Property

End Class</span>

首先DAL去实现接口IDAL中的内容

IDAL

<span style="font-family:KaiTi_GB2312;font-size:24px;">'**********************************************
' 文  件  名:IDUserInfo
' 命名空间:IDAL
' 内       容:
' 功       能:
' 文件关系:
' 作       者:贾文静
' 小       组:XX
' 生成日期:2015/12/6 15:43:20
' 版  本  号:V1.0.0.0
' 修改日志:
' 版权说明:
'**********************************************
Imports System.Reflection
Public Interface IDUserInfo
    Function Validate(ByVal user As Entity.UserInfoEntity) As Entity.UserInfoEntity
End Interface
</span>
DAL

<span style="font-family:KaiTi_GB2312;font-size:24px;">Imports System.Reflection
Imports System.Configuration
Imports IDAL
Imports System.Data.SqlClient
Public Class UserInfoDAL : Implements IDAL.IDUserInfo

    Public Function Validate(user As Entity.UserInfoEntity) As Entity.UserInfoEntity Implements IDUserInfo.Validate
        Dim strConn As String
        strConn = System.Configuration.ConfigurationManager.AppSettings("ConnStr")
        Dim conn As SqlConnection
        conn = New SqlConnection(strConn)
        Dim sql As String
        sql = "SELECT UserID,Password FROM User_Info WHERE UserID=@userid AND Password=@password"
        Dim cmd As SqlCommand
        cmd = New SqlCommand(sql, conn)

        cmd.Parameters.Add(New SqlParameter("@userid", user.UserID))
        cmd.Parameters.Add(New SqlParameter("@password", user.Password))

        conn.Open()
        Dim reader As SqlDataReader

        reader = cmd.ExecuteReader()

        Dim User1 As New Entity.UserInfoEntity
        While (reader.Read())
            User1.UserID = reader.GetInt32(0)
            User1.Password = reader.GetString(1)
        End While
        Return User1
    End Function

End Class
</span>
工厂Factory

<span style="font-family:KaiTi_GB2312;font-size:24px;">'**********************************************
' 文  件  名:UserInfoFactory
' 命名空间:Factory
' 内       容:
' 功       能:
' 文件关系:
' 作       者:贾文静
' 小       组:XX
' 生成日期:2015/12/6 15:59:45
' 版  本  号:V1.0.0.0
' 修改日志:
' 版权说明:
'**********************************************
Imports System.Configuration
Imports System.Reflection
Imports IDAL
Public Class UserInfoFactory
    Dim strDB As String = System.Configuration.ConfigurationSettings.AppSettings("DBString")

    Function CreateUserInfo() As IDUserInfo
        Return CType(Assembly.Load("DAL").CreateInstance("DAL.UserInfoDAL"), IDUserInfo)

    End Function
End Class
</span>
BLL

<span style="font-family:KaiTi_GB2312;font-size:24px;">'**********************************************
' 文  件  名:UserInfoBLL
' 命名空间:BLL
' 内       容:
' 功       能:
' 文件关系:
' 作       者:贾文静
' 小       组:XX
' 生成日期:2015/12/6 20:10:43
' 版  本  号:V1.0.0.0
' 修改日志:
' 版权说明:
'**********************************************
Imports System.Data.SqlClient
Imports Entity
Imports IDAL
Imports Factory
Public Class UserInfoBLL
    Function UserLogin(ByVal user As Entity.UserInfoEntity) As Boolean
        Dim Buser As New Entity.UserInfoEntity
        Dim Bfactory As New Factory.UserInfoFactory()

        Buser = Bfactory.CreateUserInfo.Validate(user)
        If (Not IsDBNull(Buser)) Then
            Return True
        Else
            Return False
        End If
    End Function
End Class
</span>
外观层Facade

<span style="font-family:KaiTi_GB2312;font-size:24px;">'**********************************************
' 文  件  名:UserInfoFacade
' 命名空间:Facade
' 内       容:
' 功       能:
' 文件关系:
' 作       者:贾文静
' 小       组:XX
' 生成日期:2015/12/6 20:10:13
' 版  本  号:V1.0.0.0
' 修改日志:
' 版权说明:
'**********************************************
Public Class UserInfoFacade
    Dim manager As New BLL.UserInfoBLL
    Dim F As Boolean

    Function CheckLogin(ByVal user As Entity.UserInfoEntity) As Boolean
        F = manager.UserLogin(user)
        Return F

    End Function
   
End Class
</span>
UI层

<span style="font-family:KaiTi_GB2312;font-size:24px;">Public Class frmLogin
    Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click
        Dim Uuser As New Entity.UserInfoEntity
        Dim Ufacade As New Facade.UserInfoFacade

        Uuser.UserID = txtUserID.Text.Trim
        Uuser.Password = txtPassword.Text.Trim

        Entity.UserInfoEntity.ID = txtUserID.Text.Trim
        '获取全局变量

        Dim B As Boolean
        B = Ufacade.CheckLogin(Uuser)
        If (B = True) Then
            MsgBox(Uuser.UserID + "恭喜您登陆成功")
        Else
            MsgBox("登陆失败,请重新登陆")
            txtUserID.Text = ""
            txtPassword.Text = ""
        End If
        frmMain.Show()
    End Sub

    Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click
        Me.Close()
    End Sub
End Class
</span>

其实这里面还有一点特别的重要就是,配置文件的使用,更好的实现解耦合!

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <appSettings>
    <add key="ConnStr" value="Data Source=(local);Initial Catalog=JF;User ID=sa;Pwd=123456" />
    <add key="DBString" value="SqlServer" />
    <add key="ClientSettingsProvider.ServiceUri" value="" />
  </appSettings>
</configuration>

【总结】

    其实到现在为止,七层的登陆系统就完成实现了,但是我们要自己想想看,多问一个为什么,为什么要就两个设计模式,更应该深入知道到底是怎样解耦合的,而这之后更应该好好研究外观模式和抽象工厂模式,所以在后面的内容将会继续研究一下这两个设计模式作用,不断更新中!

    【设计模式】——外观模式

    刚入门的菜鸟,如有不对之处,还请各位大神斧正,不胜感激!


你可能感兴趣的:(【机房重构】——七层登陆)