在上上篇。《机房收费系统重构(3)》。中主要是介绍了自己关于DAL层,工厂层。以及接口层,还有实体层的理解。可是好多读者再问我。你的代码呢,我在这解释一下。就是我仅仅是写出关于那几部分的理解,并没有写贴出代码让大家研究的。可是不能顺应民心的文章不是好文章,所以我在这篇文章中,将机房收费登录中七层中全部的代码,贴出来供大家拍砖斧正。还有最后我在谈谈针对BLL层和外观层的理解。

     首先我所说的七层是针对UI层,外观层,BLL层,DAL层,工厂层,实体层,接口层七层组成。

     实现登录窗口,要明确。先要查询用户是否存在,然后将登录信息写入数据库,这两个主要步骤。

首先来看看我数据库中用到的两个表:

  

    这样能方便读者更easy理解后面的代码:

    一.首先看看实体层的代码吧

(1)用户表实体层:

Public Class MO_LoginPrivate _userID As StringPrivate _level As StringPrivate _password As StringPrivate _userName As StringPrivate _computer As StringPublic Shared UserHead As String  ' 设置全局变量Public Shared UserLevel As StringPublic Property UserID() As StringGetReturn _userIDEnd GetSet(value As String)_userID = valueEnd SetEnd PropertyPublic Property PassWord() As StringGetReturn _passwordEnd GetSet(value As String)_password = valueEnd SetEnd PropertyPublic Property level() As StringGetReturn _levelEnd GetSet(value As String)_level = valueEnd SetEnd PropertyPublic Property UserName() As StringGetReturn _userNameEnd GetSet(value As String)_userName = valueEnd SetEnd PropertyPublic Property Computer() As StringGetReturn _computerEnd GetSet(value As String)_computer = valueEnd SetEnd Property
End Class

(2)工作记录实体层:

Public Class MO_WorklogPrivate _userID As StringPrivate _level As StringPrivate _loginDataTime As StringPrivate _computer As StringPrivate _status As StringPublic Shared Property Login_DataTime As StringPublic Property UserID() As StringGetReturn _userIDEnd GetSet(value As String)_userID = valueEnd SetEnd PropertyPublic Property level() As StringGetReturn _levelEnd GetSet(value As String)_level = valueEnd SetEnd PropertyPublic Property LoginDataTime() As StringGetReturn _loginDataTimeEnd GetSet(value As String)_loginDataTime = valueEnd SetEnd PropertyPublic Property Computer() As StringGetReturn _computerEnd GetSet(value As String)_computer = valueEnd SetEnd PropertyPublic Property Status() As StringGetReturn _statusEnd GetSet(value As String)_status = valueEnd SetEnd Property
End Class

   二.接着来看看UI层的吧:

Public Class frmLoginPrivate Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.ClickDim login As New Model.MO_LoginDim falogin As New Facade.FA_Login     '实例化过程Dim strResult As Stringlogin.UserID = txtUserName.Text        '赋值过程login.PassWord = txtPassWord.TextModel.MO_Login.UserHead = txtUserName.TextDim worklog As New Model.MO_Worklog    '实例化工作记录worklog.LoginDataTime = Date.Now.ToString("yyyy-mm-dd hh:mm:ss")  '上机时间worklog.Status = "正在值班"                                       '工作状态worklog.UserID = Model.MO_Login.UserHeadworklog.Computer = System.Net.Dns.GetHostName().ToString()        '本地计算机strResult = falogin.FLogin(login, worklog)                        '传參返回过程Select Case strResult                                             '推断过程Case "输入有误"MsgBox("输入有误。请又一次输入")Case "登录成功"MsgBox("登录成功")Model.MO_Worklog.Login_DataTime = worklog.LoginDataTimeMe.Hide()'frmMain.Show()End SelectEnd SubPrivate Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.ClickEndEnd Sub
End Class

   三.外观层代码:

Imports BLL
Public Class FA_LoginPublic Function FLogin(ByVal user As Model.MO_Login, worklog As Model.MO_Worklog) As StringDim UserBLL As New BLL.BL_LoginIf UserBLL.IsnotNull(user, worklog) = False ThenReturn "输入有误"ElseReturn "登录成功"End IfEnd Function
End Class

   四.BLL层代码:

<pre name="code" class="vb">Imports IDAL
Public Class BL_LoginPublic Function IsnotNull(ByVal user As Model.MO_Login, ByVal worklog As Model.MO_Worklog) As BooleanDim IUser As IDAL.ILogin                          '注意接口类型不能实例化。Dim factory As New Factory.LoginFactory           '实例化工厂Dim IWorklog As IDAL.IWorklogIUser = factory.CreateUserInfo()                  '工厂创建接口,DAL实现接口。BLL调用工厂IWorklog = factory.CreateWorklog()If IUser.User_Login(user).UserID = "" Then        '假设为空Return False                                  'Boolean值为falseElseworklog.level = IUser.User_Login(user).level   '传參数。将查询到的用户类型传给worklog实体层。在后面的增删改中应用。

If IWorklog.SaveWorkLog(worklog) Then '假设查询到用户存在,就開始将登录信息写入数据库中。

Return True End If Return True End If End Function End Class

  五.工厂层代码:

Imports System.Reflection '加入反射的引用
Imports System.Configuration '加入配置文件的引用
Imports IDAL
Public Class LoginFactory'利用反射+配置文件+抽象工厂Dim strDB As String = System.Configuration.ConfigurationSettings.AppSettings("strSqlConnection")'表示读取配置文件。假设配置文件里是SQLserver数据库就訪问,假设是别的就放訪问别的,不须要更改代码'Dim strQueryWorkLog As String = System.Configuration.ConfigurationSettings.AppSettings("strSqlConnection")'创建用户表工厂Public Function CreateUserInfo() As ILoginReturn CType(Assembly.Load("DAL").CreateInstance("DAL" & "." & "DA_Login"), ILogin)End FunctionPublic Function CreateWorklog() As IWorklogReturn CType(Assembly.Load("DAL").CreateInstance("DAL" & "." & "DA_Worklog"), IWorklog)End Function
End Class

  六.接口层代码:

(1)用户查询接口

Public Interface ILoginFunction User_Login(ByVal user As Model.MO_Login) As Model.MO_Login
End Interface

(2)将操作记录写入数据库代码:

Public Interface IWorklogFunction SaveWorkLog(ByVal worklog As Model.MO_Worklog) As Boolean
End Interface

  七.最后是DAL层代码:

(1)用户查询DAL

Imports System.Data.SqlClient
Imports System.Data
Imports IDAL
Public Class DA_Login : Implements IDAL.ILoginPublic Function User_Login(user As Model.MO_Login) As Model.MO_Login Implements IDAL.ILogin.User_LoginDim sqlparams As SqlParameter() = {New SqlParameter("@UserID", user.UserID), New SqlParameter("@Password", user.PassWord)} '传递參数过程Dim cmdText As String = "select * from T_UserInfo where UserName =@UserID and PassWord =@Password"                         '查询数据库Dim aUser As New Model.MO_Login  '实例化过程Dim helper As New SqlHelperDim cmdType As CommandType = New CommandType()cmdType = CommandType.Text       '定义命令类型为存储过程Dim table As DataTable           '实例化一个过程'在这里想解释一个,因为函数返回參数是实体层。可是这里定义的table是一个Datable类型。所以系统无法进行转换。

所以我定义了一个aUser进行中转。 table = helper.ExecuteQuery(cmdText, cmdType, sqlparams) '定义返回值 If table.Rows.Count <> 0 Then aUser.UserID = table.Rows(0).Item("UserID") aUser.PassWord = table.Rows(0).Item("PassWord") aUser.level = table.Rows(0).Item("level") aUser.UserName = table.Rows(0).Item("UserName") End If Return aUser End Function End Class

(2)操作记录写入代码DAL

Imports System.Data.SqlClient
Imports System.Data
Imports IDAL
Public Class DA_Worklog : Implements IDAL.IWorklogPublic Function SaveWorkLog(worklog As Model.MO_Worklog) As Boolean Implements IWorklog.SaveWorkLogDim strText As String = "INSERT INTO T_WorkLog(UserID,level,LoginDateTime,Computer,Status)VALUES (@UserID,@level,@LoginDateTime,@Computer,@Status)"Dim sqlparams As SqlParameter() = {New SqlParameter("@UserID", worklog.UserID), New SqlParameter("@level", worklog.level), New SqlParameter("@LoginDateTime", worklog.LoginDataTime), New SqlParameter("@Computer", worklog.Computer), New SqlParameter("@Status", worklog.Status)}Dim cmdType As CommandType = CommandType.TextDim helper As New SqlHelperReturn helper.ExecuteNonQuery(strText, cmdType, sqlparams)End Function
End Class

事实上这些代码也不全。少了关于工厂反射的配置部分的内容,还有就是SqlHelper。

SqlHelper,在我《机房收费重构(4)》中有非常具体的介绍。

在这就不写了。


    最后说一下关于BLL和外观层的理解吧。从代码看。仿佛感觉外观层没有什么作用,是的,关于登录窗口小功能的实现,没有太大的必要用外观层,可是以后要敲一个庞大的窗口时,我们须要将U层和B层解耦,那么外观层的作用就彰显出来了。关于BLL和外观事实上没有什么想说的。最想说的是数据类型的转换,由于层与层之间传递參数和返回參数的过程须要用到相同类型的数据,可是将数据类型都设置为Datatable和string或者实体类型是不可能。希望大家在今后写程序过程中注意就能够了。

   本片文章代码较多。希望大家拍砖斧正。。

机房收费系统重构(五)—登陆窗口完整版相关推荐

  1. vb.net机房收费系统重构——存储过程的使用

    在敲写七层登陆过程中,接触了存储过程的概念,但当时还没使用.在正式的重构过程中,一点点添加,将存储过程也添加到了重构中.才正式了解了存储过程. 首先 [存储过程的概念] 存储过程Procedure是一 ...

  2. 机房收费系统重构之存储过程的使用

    从一开始对于机房收费系统的无从下手,到现在已经接近尾声,像冬天的迷雾一样,随着时间散开了去,对于其也是越来越清晰,想一想,这种学习的过程还真是美妙. 当然只学习不去总结是没有意义的.今天我就来把存储过 ...

  3. 机房收费系统系列五:报表

           在机房收费系统中还有两个地方用到了报表:日报表和周报表,在我看来日报表和周报表其实是一样的,日报表是统计一天的收入,支出,对每天金额做个统计,周报表就是记录从某个时间段到另一个时间段的净 ...

  4. 机房收费系统重构版:照葫芦画瓢

        跟随着培养计划的步伐,自己弄完三层后就风风火火的开始了自己机房重构之路!现在回首这一路,有苦过有兴奋过,有想放弃不再做的时候也有挑灯夜战本本没电自动关机的时候,这一切的一切组成了自己这段时间最 ...

  5. 机房收费系统重构(三)—工厂+反射+DAL

    前段时间用简单的三层实现了窗体登录功能,心中有点小小的成就感,但是很快就被泼了凉水,机房收费不可能只用三层实现,如果你用三层,也就是说后面机房收费所有的功能都必须使用三层来实现功能.所以一周前始了七层 ...

  6. 机房收费系统重构版:那个系统我们一起遇到的问题

    前言:  总是说在问题中茁壮成长,俗话说光说不练假把式!回想之前确实停留在嘴上说说就完事了的假把式上,这次敲了第二次机房重构后根据自己的切身经历仔细回味了一番.相比于之前有了更深的理解吧,感觉还是有记 ...

  7. 机房收费系统个人重构版:暮然回首,灯火阑珊

    [背景]   在蹒跚中自己的机房收费系统个人重构版已完结:回望这一路征程,感慨颇多:快乐过,痛苦过:紧张过,放松过!真可谓:酸甜苦辣,五味杂陈. [比一比] VB.Net版个人重构版比VB版机房收费系 ...

  8. 重构机房收费系统(二)

    接上篇<机房收费系统重构(一)> 二.概要设计 完成了用例图,并用结合用例图完善了一下需求分析说明书,忘记是第几次修订需求分析说明书.有了用例图,很自然就进入了概要设计阶段.我认为这一阶段 ...

  9. 重构机房收费系统(一)

    从10月1号开始重构学校机房收费系统,没想到这次重构,推翻,再重构--用了两周时间. 这次整体架构采用三层,并融入了一些设计模式. 下面介绍这次重构的过程: 一.从UML用例图开始 对于机房收费系统的 ...

最新文章

  1. 云栖专辑|阿里开发者们的第二个感悟:PG大V德哥的使命感与开放心态
  2. Some Tips About Layout Resource
  3. ElasticSearch插件demo
  4. openCV中waitKey函数介绍
  5. linux mysql授权远程登录,Linux中 MySQL 授权远程连接的方法步骤
  6. latex表格名的引用问题
  7. Python程序设计学习笔记-数据类型
  8. matlab 找椭圆中心点,点差分法matlab解椭圆型偏微分方程
  9. Unable to instantiate application com.honjane.app.MyApplication
  10. vm安装centos,黑屏或黑屏且左上角有光标闪动
  11. 洛谷p3398仓鼠找suger题解
  12. faster-RCNN tensorflow-gpu环境配置及安装出现的问题
  13. java 刻度尺_用java代码如何实现画坐标刻度尺图
  14. 马士兵老师Struts2学习笔记
  15. 解决Error:403 No valid crumb was included in the request
  16. 米的换算单位和公式_毫米和米的换算
  17. .net6API使用AutoMapper和DTO
  18. 12 个好用且不花钱的网络监控工具
  19. {:query, :rabbit@centos7, {:badrpc, :timeout}} 快速解决
  20. “字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛 1,2,3,4,5,7,8,9,10

热门文章

  1. 全局唯一递增的id_分布式ID生成方法-趋势有序的全局唯一ID
  2. python的难点_初学python的操作难点总结(新手必看篇)
  3. re匹配正则字符串中的起始和结束元字符的使用方法
  4. spring 扫描所有_SpringBoot和Spring到底有没有本质的不同?
  5. idea tomcat乱码_Tomcat新手常见问题
  6. 怎么判断间隙过渡过盈配合_尺寸公差配合与装配方法
  7. java float 转double_将float转换为double而不会丢失精度
  8. Leetcode周赛5193. 删除字符使字符串变好
  9. 百练OJ:2964:日历问题
  10. 笔记-项目整体管理-复习要点