个人重构之一般用户实现
開(kāi)始個(gè)人重構(gòu)的時(shí)間不短了,登錄一條線就花了好長(zhǎng)時(shí)間。七層現(xiàn)在可算是理清了。下面我先說(shuō)一下一般用戶功能的實(shí)現(xiàn)。? ??? ?1、功能分析:
@登錄驗(yàn)證
@查詢信息
@修改密碼
2、具體實(shí)現(xiàn)
我用到的是七層。一條線敲成了,才真正的明白七層的真正含義。
除了UI、BLL、DAL這三層之外又加上了Entity、Facade、IDAL、Factory+反射+配置文件。
Entity是實(shí)體層。可以說(shuō)它是關(guān)系數(shù)據(jù)庫(kù)和對(duì)象之間架的一座橋梁。
Facade是外觀層。作為解耦UI層與BLL層,避免了它們之間的直接關(guān)聯(lián)。
IDAL是DAL的接口。BLL層直接與IDAL聯(lián)系,此時(shí),如果DAL層有變動(dòng)則不需要再改動(dòng)BLL層。
Factory+反射+配置文件:作數(shù)據(jù)連接。把東西寫(xiě)活了,在換數(shù)據(jù)庫(kù)的時(shí)候就省事多了。
其實(shí)加設(shè)計(jì)模式就是為了更好地解耦,提高工作效率。
3、代碼展示
【登錄】
先看D層:根據(jù)條件設(shè)置訪問(wèn)數(shù)據(jù)庫(kù)。
<strong><span style="font-family:KaiTi_GB2312;font-size:18px;">Public Class SqlserverLoginDAL : Implements IDAL.ILogin</span></strong><div style="text-align: left;"><strong style="background-color: rgb(255, 255, 255); text-align: center;"><span style="line-height: 26px;"><span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="line-height: 21px;"></span></span></span></strong></div><strong><span style="font-family:KaiTi_GB2312;font-size:18px;"> Public Function LoginDAL(user As LoginEntity) As List(Of LoginEntity) Implements IDAL.ILogin.LoginDAL'傳遞參數(shù),將自己需要查詢的內(nèi)容傳入Dim sqlparams As SqlParameter() = {New SqlParameter("@UserID", user.UserID),New SqlParameter("@Password", user.Password)}'查詢數(shù)據(jù)庫(kù),找到需要的信息Dim cmdText As String = "select * from T_User where UserID=@UserID and Password=@Password"'定義并實(shí)例化sqlHelperDim helper As New SqlHelper'定義并實(shí)例化類型' Dim cmdType As CommandType = New CommandType()'定義一個(gè)臨時(shí)表Dim table As DataTable'調(diào)用sqlHelper中的查詢方法,將查詢的信息存入到臨時(shí)表中table = helper.ExecSelect(cmdText, CommandType.Text, sqlparams)'定義一個(gè)泛型集合Dim myList As New List(Of LoginEntity)'將查詢到的結(jié)果轉(zhuǎn)換為泛型集合myList = sqlDataTable.DataToList.converToList(Of LoginEntity)(table)Return myListEnd FunctionEnd Class</span></strong> 2、IDAL:提供D層接口。直接與BLL聯(lián)系。 <strong><span style="font-family:KaiTi_GB2312;">Imports Entity Public Interface ILoginFunction LoginDAL(ByVal euser As LoginEntity) As List(Of LoginEntity) '用戶登錄 End Interface</span></strong>3、BLL:進(jìn)行業(yè)務(wù)的處理 <span style="font-family:KaiTi_GB2312;">'判斷用戶是否存在Public Function IsExit(ByVal euser As Entity.LoginEntity) As List(Of Entity.LoginEntity)'實(shí)例化()Dim factory As New DataAccessDim iLogin As ILoginDim myList As New List(Of Entity.LoginEntity)'工廠創(chuàng)建接口, DAL實(shí)現(xiàn)接口, BLL調(diào)用工廠iLogin = factory.CreatUserInfo()myList = iLogin.LoginDAL(euser)Return myListEnd Function</span>4、Facade層:解耦UI層和BLL層 '用戶登錄獲取記錄Public Function FLogin(ByVal user As Entity.LoginEntity) As Entity.LoginEntityDim UserBLL As New BLL.LoginBLLDim mylist As New List(Of Entity.LoginEntity)mylist = UserBLL.IsExit(user)user.Level = mylist(0).LevelReturn userEnd Function5、UI層:具體的窗體設(shè)置等。 Public Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click'判斷用戶名是否為空If Trim(txtUserName.Text) = "" Then '如果為空MessageBox.Show("請(qǐng)輸入用戶名!")Exit SubEnd If'判斷密碼是否為空If Trim(txtPassword.Text) = "" ThenMessageBox.Show("請(qǐng)輸入密碼!")Exit SubEnd IfDim login As New Entity.LoginEntityDim falogin As New Facade.FA_Loginlogin.UserID = txtUserName.Textlogin.Password = txtPassword.TextDim strResult = falogin.CheckUser(login)Select Case strResultCase "密碼錯(cuò)誤"MsgBox("輸入有誤,請(qǐng)重新輸入")txtPassword.Text = ""Case "用戶不存在"MsgBox("用戶名或密碼錯(cuò)誤,請(qǐng)重新輸入")txtPassword.Text = ""txtUserName.Text = ""Case "密碼正確"MsgBox("登錄成功")Dim worklog As New Entity.WorkLogEntityworklog.LoginDateTime = Date.Now.ToString("yyyy-mm-dd hh:mm:ss")worklog.Status = "正在值班"worklog.UserID = txtUserName.Text'worklog.Computer = System.Net.Dns.GetHashCode().ToString()worklog.Computer = "FKG-PC"Entity.WorkLogEntity.Login_DateTime = worklog.LoginDateTimefrmmain.Show()Me.Hide() <span style="white-space:pre"> </span>End Select End SubPrivate Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click <span style="white-space:pre"> </span>End End Sub End Class
6、Entity層:定義字段屬性及其返回值等。 Public Class LoginEntityPrivate _userID As StringPrivate _Password As StringPrivate _Level As StringPrivate _userName As StringPublic Shared Property UserLevel As StringPublic Property UserID() As StringGetReturn _userIDEnd GetSet(value As String)_userID = valueEnd SetEnd PropertyPublic Property Password() As StringGetReturn _PasswordEnd GetSet(value As String)_Password = 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 PropertyEnd Class 7、最后就是對(duì)工廠加反射加配置文件的設(shè)置了。這個(gè)其實(shí)很簡(jiǎn)單,在APP.config里面設(shè)置一下就OK啦。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
? ? <startup>
? ? ? ? <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
? ? </startup>
? ? <appSettings >
<add key ="DB" value ="Sqlserver"/>
<add key ="ConnString" value ="Server=.;Database=recharge_sys;UID=sa;PWD=***"/>
</appSettings>
</configuration>
其實(shí)登錄并不難,一條線敲通了,后面的就好了。還有一個(gè)功能就是對(duì)于信息的查詢,這個(gè)比較簡(jiǎn)單,我就不詳細(xì)說(shuō)了。下面總結(jié)一下在這個(gè)過(guò)程中自己遇到的一些問(wèn)題。
問(wèn)題一:
解決方法:這個(gè)是在我剛開(kāi)始建項(xiàng)目的時(shí)候,因?yàn)椴恍⌒慕ㄥe(cuò)了解決方案,剛一開(kāi)始的時(shí)候就是把它放那里不管了,后來(lái)覺(jué)得沒(méi)有用的就刪了得了,結(jié)果這一刪壞事了。自從刪了之后就開(kāi)始報(bào)上面的錯(cuò)了,于是我就各種方法各種試,先是重新添加了一遍引用,之后又是重新生成解決方案,保存。。。這樣,之后就不報(bào)錯(cuò)了。
問(wèn)題二:未將對(duì)象引用至對(duì)象實(shí)例
這個(gè)問(wèn)題,幾乎在我敲每一個(gè)窗體的時(shí)候都會(huì)遇到它,我很是無(wú)語(yǔ)。總結(jié)一下出現(xiàn)這種狀況的一些原因。 1.D層連接數(shù)據(jù)庫(kù)的地方寫(xiě)錯(cuò)了。 2.數(shù)據(jù)類型不一致時(shí) 3.重復(fù)定義造成未將對(duì)象引用設(shè)置到對(duì)象的實(shí)例錯(cuò)誤. ...未完待續(xù)...
總結(jié):機(jī)房重構(gòu)遲遲不想開(kāi)始,其實(shí)就是害怕自己敲不出來(lái)了,但是不敲就永遠(yuǎn)都不明白,既然身在其中,你就要做你該做的事,付出總是會(huì)有回報(bào)的。fighting
轉(zhuǎn)載于:https://www.cnblogs.com/fengkungui/p/6040203.html
總結(jié)
以上是生活随笔為你收集整理的个人重构之一般用户实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Laravel 5.0 的新特性
- 下一篇: Android 动态刷新listview