前两篇文章主要是介绍了三层的登陆,但是前一段时间我们学过了设计模式,希望可以尝试着使用一下,根据需求,将两个设计模式添加到了三层登陆中,对程序架构进行进一步的解耦合!
其实七层就是在原来三层的基础上添加了两个设计模式,一个是外观模式和抽象工厂模式,所以七层也不用害怕,只是将三层进行了扩充!图中的内容是个人理解,在这里要说明的是之前虽说是三成,但是实际是四层的,因为还有一个很重要的实体层。
关于七层之间实体的传递问题,一张图更能胜过前言万语!在图中大家要注意的时,接口层(IDAL)和数据访问层(DAL)是实现关系,并不是单纯的依赖关系。
下面还是看看我的解决方案
下面我就按照这个数据传递的顺序进行,给大家看一下我的代码部分。
最基础的部分实体层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>
【总结】
其实到现在为止,七层的登陆系统就完成实现了,但是我们要自己想想看,多问一个为什么,为什么要就两个设计模式,更应该深入知道到底是怎样解耦合的,而这之后更应该好好研究外观模式和抽象工厂模式,所以在后面的内容将会继续研究一下这两个设计模式作用,不断更新中!
刚入门的菜鸟,如有不对之处,还请各位大神斧正,不胜感激!