七层登录实现
七層登錄實(shí)現(xiàn)
? ? ? ? ? 機(jī)房重構(gòu)剛開始的七層登錄,剛開始其中有很多的地方都不理解,后來通過查資料,看博客,問同學(xué)慢慢的明白一點(diǎn)了。
? ? ? ? ??七層就是在三層的基礎(chǔ)之上,添加了外觀層——設(shè)計(jì)模式的外觀模式,抽象工廠加反射,接口層。
? ? ? ? ??外觀層:主要是把UI和BLL層分離。
? ? ? ? ??抽象工廠加反射:主要是為了更換數(shù)據(jù)庫的方便性,同時(shí)把DAL層中的類轉(zhuǎn)換成為IDAL層中的接口,從而使BLL層實(shí)現(xiàn)通過調(diào)用IDAL從而調(diào)用DAL層。
? ? ? ? ??接口層:把BLL和DAL分離。
? ? ? ? ??這樣,當(dāng)需要改動系統(tǒng)的時(shí)候,非常的方便,使用七層做到了大大的解耦和,當(dāng)有新的需求出現(xiàn)的時(shí)候或者在后期的系統(tǒng)維護(hù)時(shí),僅僅需要改動某一層就可以,或者具體到某一層中的某一個(gè)類就可以,而不至于牽一發(fā)而動全身,提高了系統(tǒng)的可擴(kuò)展性,可維護(hù)性和靈活性。
? ? ? ? ??UML中一共有四大關(guān)系,即關(guān)聯(lián)、依賴、泛化和實(shí)現(xiàn),這里用到了三種,即關(guān)聯(lián)、依賴和實(shí)現(xiàn)。
? ? ? ? ??七層從UI層開始,逐層依賴于下一層,除了SqlHelper和Factory之外的所有的層,都要添加對Entity層的引用,這里是關(guān)聯(lián)關(guān)系,因?yàn)樗械膶釉谑褂脤?shí)體層的時(shí)候,首先都先要對實(shí)體進(jìn)行實(shí)例化,即New一個(gè)實(shí)體,所以暫時(shí)理解為關(guān)聯(lián)關(guān)系(最普通的關(guān)聯(lián)關(guān)系,不是聚合也不是組合關(guān)系),而DAL層實(shí)現(xiàn)的是IDAL層中的方法,同時(shí)依賴于SqlHelper實(shí)現(xiàn)它自己的功能。
? ? ? ? ??各層的具體代碼:
? ? ? ? ??UI層
<span style="font-size:24px;"><span style="font-size:24px;">Public Class FrmLoginPrivate Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click'判斷文本框是否為空If txtUserID.Text = "" ThenMessageBox.Show("請您輸入用戶名!", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)txtUserID.Focus()Exit SubElseIf txtPWD.Text = "" ThenMessageBox.Show("請您輸入密碼!", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)txtPWD.Focus()Exit SubEnd If'實(shí)例化實(shí)體類'把用戶名和密碼放到實(shí)體中Dim User As New Entity.T_UserEntityUser.UserID = txtUserID.Text.Trim()User.PWD = txtPWD.Text.Trim()Dim Result As StringDim facade As New Facade.LoginFacadeResult = facade.Login(User)'用戶名和密碼驗(yàn)證的幾種情況Select Case ResultCase "此用戶不存在"MsgBox("此用戶不存在,請重新輸入用戶名!")txtUserID.Focus()txtUserID.SelectAll()Case "密碼錯(cuò)誤"MsgBox("密碼錯(cuò)誤,請重新輸入密碼!")txtPWD.Focus()txtPWD.SelectAll()Case "登陸成功"MsgBox("恭喜您,登錄成功!")NowUser = txtUserID.Text.Trim()FrmMain.Show()Me.Hide()End SelectEnd SubPrivate Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.ClickEndEnd SubEnd Class</span></span>? ? ? ? ??Fa?ade層
<span style="font-size:24px;"><span style="font-size:24px;">Public Class LoginFacadePublic Function Login(ByVal User As Entity.T_UserEntity) As StringDim Userbll As New BLL.LoginBLL'調(diào)用B層的方法驗(yàn)證用戶名和密碼是否正確If Userbll.CheckUser(User) = False ThenReturn "此用戶不存在"ElseIf Userbll.CheckPWD(User) = False ThenReturn "密碼錯(cuò)誤"ElseReturn "登陸成功"End IfEnd IfEnd FunctionEnd Class</span></span>? ? ? ? ??BLL層
<span style="font-size:24px;"><span style="font-size:24px;">Public Class LoginBLL'驗(yàn)證用戶名是否正確Public Function CheckUser(ByVal user As Entity.T_UserEntity) As BooleanDim Iuser As IDAL.LoginIDALDim factory As New Factory.LoginFactoryIuser = factory.CreateUserDAO()Dim mylist As New List(Of Entity.T_UserEntity)mylist = Iuser.SelectUserID(user)If mylist.Count = 0 ThenReturn FalseElseReturn TrueEnd IfEnd Function'驗(yàn)證密碼是否正確Public Function CheckPWD(ByVal password As Entity.T_UserEntity) As BooleanDim Iuser As IDAL.LoginIDALDim factory As New Factory.LoginFactoryIuser = factory.CreateUserDAODim mylist As New List(Of Entity.T_UserEntity)mylist = Iuser.SelectPWD(password)If mylist.Count = 0 ThenReturn FalseElseReturn TrueEnd IfEnd FunctionEnd Class</span></span>? ? ? ? ??Factory層
<span style="font-size:24px;"><span style="font-size:24px;">Imports System.Reflection Imports System.Configuration'連接數(shù)據(jù)庫時(shí)采用了抽象工廠加反射 '抽象工廠,負(fù)責(zé)數(shù)據(jù)庫的選擇和創(chuàng)建接口 Public Class LoginFactoryDim DB As String = System.Configuration.ConfigurationSettings.AppSettings("DBss")Private Shared ReadOnly assemblyName = "DAL"Public Function CreateUserDAO() As IDAL.LoginIDAL'返回接口Dim className As String = assemblyName + "." + DB + "LoginDAL"Return CType(Assembly.Load(assemblyName).CreateInstance(className), IDAL.LoginIDAL)End Function End Class</span></span>? ? ? ? ??IDAL層
<span style="font-size:24px;"><span style="font-size:24px;">'接口IDAL Public Interface LoginIDALFunction SelectUserID(ByVal User As Entity.T_UserEntity) As List(Of Entity.T_UserEntity)Function SelectPWD(ByVal User As Entity.T_UserEntity) As List(Of Entity.T_UserEntity) End Interface</span></span>? ? ? ? ??DAL層
<span style="font-size:24px;"><span style="font-size:24px;">Imports System.Data Imports System.Data.SqlClient Imports Entity'D層用來將接口實(shí)例化 Public Class SqlServerLoginDAL : Implements IDAL.LoginIDALPublic Function SelectUserID(User As Entity.T_UserEntity) As List(Of Entity.T_UserEntity) Implements IDAL.LoginIDAL.SelectUserIDDim sqlParams As SqlParameter() = {New SqlParameter("@UserID", User.UserID)}Dim strSql As String = "select*from T_User where UserID=@UserID"'實(shí)例化SqlHelperDim helper As New SqlHelperDim table As New DataTableDim mylist As New List(Of Entity.T_UserEntity)table = helper.GetDataTable(strSql, CommandType.Text, sqlParams)mylist = ConvertHelper.ConvertList(Of Entity.T_UserEntity)(table)'返回泛型Return mylistEnd FunctionPublic Function SelectPWD(User As Entity.T_UserEntity) As List(Of Entity.T_UserEntity) Implements IDAL.LoginIDAL.SelectPWDDim sqlParams As SqlParameter() = {New SqlParameter("@UserID", User.UserID), New SqlParameter("@PWD", User.PWD)}Dim strSql As String = "select*from T_User where UserID=@UserID and PWD=@PWD"'實(shí)例化SqlHelperDim helper As New SqlHelperDim table As New DataTableDim mylist As New List(Of Entity.T_UserEntity)table = helper.GetDataTable(strSql, CommandType.Text, sqlParams)mylist = ConvertHelper.ConvertList(Of Entity.T_UserEntity)(table)'返回泛型Return mylistEnd Function End Class</span></span>? ? ? ? ??Entity層
<span style="font-size:24px;"><span style="font-size:24px;">Public Class T_UserEntity'定義變量Private _UserID As StringPrivate _PWD As StringPrivate _Level As StringPrivate _UserName As StringPrivate _Head As StringPublic Property UserID As StringGetReturn _UserIDEnd GetSet(value As String)_UserID = valueEnd SetEnd PropertyPublic Property PWD As StringGetReturn _PWDEnd GetSet(value As String)_PWD = valueEnd SetEnd PropertyPublic Property Level As StringGetReturn _LevelEnd GetSet(value As String)_Level = valueEnd SetEnd PropertyPublic Property UserName As StringGetReturn _UserNameEnd GetSet(value As String)_UserName = valueEnd SetEnd PropertyPublic Property Head As StringGetReturn _HeadEnd GetSet(value As String)_Head = valueEnd SetEnd Property End Class</span></span>
? ? ? ? ??泛型返回的是整張數(shù)據(jù)表,比如查詢正在上機(jī)的所有學(xué)生等等,需要的是一個(gè)數(shù)據(jù)表中所有的數(shù)據(jù)時(shí),才使用泛型。
總結(jié)
- 上一篇: 数据关系图
- 下一篇: 重构之SqlHelper