开始个人重构的时间不短了,登录一条线就花了好长时间。七层现在可算是理清了。下面我先说一下一般用户功能的实现。 1、功能分析:
@登录验证
@查询信息
@修改密码
2、具体实现
我用到的是七层。一条线敲成了,才真正的明白七层的真正含义。
除了UI、BLL、DAL这三层之外又加上了Entity、Facade、IDAL、Factory+反射+配置文件。
Entity是实体层。可以说它是关系数据库和对象之间架的一座桥梁。
Facade是外观层。作为解耦UI层与BLL层,避免了它们之间的直接关联。
IDAL是DAL的接口。BLL层直接与IDAL联系,此时,如果DAL层有变动则不需要再改动BLL层。
Factory+反射+配置文件:作数据连接。把东西写活了,在换数据库的时候就省事多了。
其实加设计模式就是为了更好地解耦,提高工作效率。
3、代码展示
【登录】
先看D层:根据条件设置访问数据库。
Public Class SqlserverLoginDAL : Implements IDAL.ILogin
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 FunctionEnd Class
2、IDAL:提供D层接口。直接与BLL联系。
Imports EntityPublic Interface ILogin Function LoginDAL(ByVal euser As LoginEntity) As List(Of LoginEntity) '用户登录End Interface
3、BLL:进行业务的处理 '判断用户是否存在 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
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() End SelectEnd Sub Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click End
End SubEnd Class6、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 PropertyEnd 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