机房收费系统在历时17天之后,磕磕绊绊的写完了,虽然一直都没有订每天的任务量,但是总体感觉还行,因为中间差不多每天要花费三个小时去听英语,我听英语还是比较认真的。
其实想想做机房收费系统的整个过程,也就是在登录窗体的时候卡住了,因为这是第一次用三层做,而且说实话对VB.NET不是特别熟悉,登录窗体能够运行之后,后面的大概就是堆代码了。
这是我机房收费系统的包图。下面以登录窗体写层实现的过程
DALL层
因为考虑到以后更换数据库的问题,所以DAL层用到了抽象工厂模式。所以相应的也就加了DataAccess层,IDAL接口层,SQLHelper主要用于SQL调用之类的类。
抽象工厂模式下的DAL层:
IuserInfo接口(即为包图中的IDAL层里的一个类),用户客户端访问,接触与具体数据库访问的耦合(此处只以登录窗体为例,所以所涉及到的数据库操作相对较少)
Public Interface IUserInfo Function UserInsert(ByVal entityuserInfo As Entity.enUserInfo) As Boolean End Interface
SqlserverUserInfo类(即为DAL中的一个类),用于访问SQL Server的UserInfo(如何访问的是Access数据库,可以按此写一个访问Access的类)
Public Function UserInquire(entityuserInfo As Entity.enUserInfo) As Boolean Implements IDAL.IUserInfo.UserInquire ' Dim sql As String = String.Format("select * from UserInfo where userName={0} and passWord={1} and Status={2}", entityuserInfo.UserName, entityuserInfo.Password, entityuserInfo.StatusType) Dim sql As String = String.Format("select * from UserInfo where userName={0} and passWord={1} and Status={2}", _ enUserInfo.DBPARAM_USERNAME, enUserInfo.DBPARAM_PASSWORD, enUserInfo.DBPARAM_STATUSTYPE) Dim sqlHelp As New SQLhelper.daBase Dim conn As SqlConnection = sqlHelp.CreateConn(connStr) Dim cmd As SqlCommand = New SqlCommand(sql, conn) AddSqlParameter(cmd, enUserInfo.DBPARAM_USERNAME, SqlDbType.Char, entityuserInfo.UserName) AddSqlParameter(cmd, enUserInfo.DBPARAM_PASSWORD, SqlDbType.Char, entityuserInfo.Password) AddSqlParameter(cmd, enUserInfo.DBPARAM_STATUSTYPE, SqlDbType.Char, entityuserInfo.Status) Dim sdr As SqlDataReader = Nothing Try conn.Open() sdr = cmd.ExecuteReader() sdr.Read() If (sdr.HasRows = True) Then Return True Else Return False End If Catch ex As Exception Return False Finally Close(conn) Close(cmd) Close(sdr) End Try End Function
(此处用到很多例如关闭数据库,关闭记录集,传参的函数,具体的都写在SQLHelp中,不一一列举)
Ifactory接口(DataAccess包中的类),定义一个创建访问UserInfo表对象的抽象的工厂接口。
Public Interface IFactory Function creatUserInfo() As IUserInfo End Interface
SqlServerFactory类,实现Ifactory接口,实例化SqlserverUser(如何是Access,照此可以直接写出)
Public Class SqlServerFactory : Implements IFactory Public Function creatUserInfo() As IDAL.IUserInfo Implements IFactory.creatUserInfo Dim dalUser As New DAL.sqlUserInfo Return dalUser End Function
此处的关键就在于,如果需要更换数据库,直接增加Access类即可,不需要改动源码。
下面是Bll层
Public Function userQuery(ByVal entityUserInfo As Entity.enUserInfo) As Boolean Dim fatory = New DataAccess.SqlServerFactory Dim userInfo As IDAL.IUserInfo = fatory.creatUserInfo Dim flag As Boolean flag = CBool(userInfo.UserInquire(entityUserInfo)) Return flag End Function
我写的BLL层是从DAL层写的,当然也可以按照UI层来写
外观层只要是用来对UI层所需要数据的整理打包
FAÇADE外观层:
Public Function Logon(ByVal entityUserInfo As Entity.enUserInfo, ByVal entityWorkLog As Entity.enWorkLog) As Boolean Dim user As New BllUserInfo Dim flag As Boolean flag = user.userQuery(entityUserInfo) Return flag End Function
最后是U层,因为U层涉及到窗体登录是传的数据,还有判断,这是大家都知道的,所以,下面只写出U层中与三层有关的两句
Dim facade = New BllFacade.Logon facade.Logon(entityUserInfo)