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