首页 > 技术文章 > 个人重构之一般用户实现

fengkungui 2015-02-08 13:37 原文

开始个人重构的时间不短了,登录一条线就花了好长时间。七层现在可算是理清了。下面我先说一下一般用户功能的实现。       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 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



推荐阅读