个人重构之一般用户实现
开始个人重构的时间不短了,登录一条线就花了好长时间。七层现在可算是理清了。下面我先说一下一般用户功能的实现。
1、功能分析:
@登录验证
@查询信息
@修改密码
2、具体实现
我用到的是七层。一条线敲成了,才真正的明白七层的真正含义。
除了UI、BLL、DAL这三层之外又加上了Entity、Facade、IDAL、Factory+反射+配置文件。
Entity是实体层。可以说它是关系数据库和对象之间架的一座桥梁。
Facade是外观层。作为解耦UI层与BLL层,避免了它们之间的直接关联。
IDAL是DAL的接口。BLL层直接与IDAL联系,此时,如果DAL层有变动则不需要再改动BLL层。
Factory+反射+配置文件:作数据连接。把东西写活了,在换数据库的时候就省事多了。
其实加设计模式就是为了更好地解耦,提高工作效率。
3、代码展示
【登录】
先看D层:根据条件设置访问数据库。
<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
'传递参数,将自己需要查询的内容传入
Dim sqlparams As SqlParameter() = {New SqlParameter("@UserID", user.UserID),
New SqlParameter("@Password", user.Password)}
'查询数据库,找到需要的信息
Dim cmdText As String = "select * from T_User where UserID=@UserID and Password=@Password"
'定义并实例化sqlHelper
Dim helper As New SqlHelper
'定义并实例化类型
' Dim cmdType As CommandType = New CommandType()
'定义一个临时表
Dim table As DataTable
'调用sqlHelper中的查询方法,将查询的信息存入到临时表中
table = helper.ExecSelect(cmdText, CommandType.Text, sqlparams)
'定义一个泛型集合
Dim myList As New List(Of LoginEntity)
'将查询到的结果转换为泛型集合
myList = sqlDataTable.DataToList.converToList(Of LoginEntity)(table)
Return myList
End Function
End Class</span></strong>
2、IDAL:提供D层接口。直接与BLL联系。
<strong><span style="font-family:KaiTi_GB2312;">Imports Entity
Public Interface ILogin
Function LoginDAL(ByVal euser As LoginEntity) As List(Of LoginEntity) '用户登录
End Interface</span></strong>3、BLL:进行业务的处理<span style="font-family:KaiTi_GB2312;">'判断用户是否存在
Public Function IsExit(ByVal euser As Entity.LoginEntity) As List(Of Entity.LoginEntity)
'实例化()
Dim factory As New DataAccess
Dim iLogin As ILogin
Dim myList As New List(Of Entity.LoginEntity)
'工厂创建接口, DAL实现接口, BLL调用工厂
iLogin = factory.CreatUserInfo()
myList = iLogin.LoginDAL(euser)
Return myList
End Function</span>4、Facade层:解耦UI层和BLL层 '用户登录获取记录
Public Function FLogin(ByVal user As Entity.LoginEntity) As Entity.LoginEntity
Dim UserBLL As New BLL.LoginBLL
Dim mylist As New List(Of Entity.LoginEntity)
mylist = UserBLL.IsExit(user)
user.Level = mylist(0).Level
Return user
End Function5、UI层:具体的窗体设置等。
Public Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click
'判断用户名是否为空
If Trim(txtUserName.Text) = "" Then '如果为空
MessageBox.Show("请输入用户名!")
Exit Sub
End If
'判断密码是否为空
If Trim(txtPassword.Text) = "" Then
MessageBox.Show("请输入密码!")
Exit Sub
End If
Dim login As New Entity.LoginEntity
Dim falogin As New Facade.FA_Login
login.UserID = txtUserName.Text
login.Password = txtPassword.Text
Dim strResult = falogin.CheckUser(login)
Select Case strResult
Case "密码错误"
MsgBox("输入有误,请重新输入")
txtPassword.Text = ""
Case "用户不存在"
MsgBox("用户名或密码错误,请重新输入")
txtPassword.Text = ""
txtUserName.Text = ""
Case "密码正确"
MsgBox("登录成功")
Dim worklog As New Entity.WorkLogEntity
worklog.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.LoginDateTime
frmmain.Show()
Me.Hide()
<span style="white-space:pre"> </span>End Select
End Sub
Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click
<span style="white-space:pre"> </span>EndEnd Sub End Class
6、Entity层:定义字段属性及其返回值等。
Public Class LoginEntity
Private _userID As String
Private _Password As String
Private _Level As String
Private _userName As String
Public Shared Property UserLevel As String
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 Level() As String
Get
Return _Level
End Get
Set(value As String)
_Level = 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
End Class
7、最后就是对工厂加反射加配置文件的设置了。这个其实很简单,在APP.config里面设置一下就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>
其实登录并不难,一条线敲通了,后面的就好了。还有一个功能就是对于信息的查询,这个比较简单,我就不详细说了。下面总结一下在这个过程中自己遇到的一些问题。
问题一:
解决方法:这个是在我刚开始建项目的时候,因为不小心建错了解决方案,刚一开始的时候就是把它放那里不管了,后来觉得没有用的就删了得了,结果这一删坏事了。自从删了之后就开始报上面的错了,于是我就各种方法各种试,先是重新添加了一遍引用,之后又是重新生成解决方案,保存。。。这样,之后就不报错了。
问题二:未将对象引用至对象实例
这个问题,几乎在我敲每一个窗体的时候都会遇到它,我很是无语。总结一下出现这种状况的一些原因。
1.D层连接数据库的地方写错了。
2.数据类型不一致时
3.重复定义造成未将对象引用设置到对象的实例错误.
...未完待续...
总结:机房重构迟迟不想开始,其实就是害怕自己敲不出来了,但是不敲就永远都不明白,既然身在其中,你就要做你该做的事,付出总是会有回报的。fighting

浙公网安备 33010602011771号