个人重构之一般用户实现
开始个人重构的时间不短了,登录一条线就花了好长时间。七层现在可算是理清了。下面我先说一下一般用户功能的实现。
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 Function
5、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>End
End 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 Class7、最后就是对工厂加反射加配置文件的设置了。这个其实很简单,在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