又捂了好久,这篇博客终于长毛了,我决定把它拿出来让它汲取一点大地的灵气和光华。
从上次用三层实现几个功能之后开始尝试用所谓的七层构筑机房收费系统。单从数目上就被吓个半死,查阅各种高人的博客,辅以自己的软磨硬泡,终于有些思路了,七层的机房好像也就没有那么复杂了。
1.七层
所谓的七层是在原先三层+实体类的基础上加一个外观、工厂、接口、配置文件和反射的使用,就像下面的图中显示的:
使用这么多东西时为了什么,之前三层不是也挺好的,比如为什么就一定要在UI和BLL层之间添加一个Facade呢?加它岂不是费劲?大家还记不记得,使用三层的用意?我们以前用的VB敲出来的程序代码都是一体的,当遇到程序完善或者修改时我们要进行很大篇幅的修改和很长的时间,而三层恰恰解决了这个问题,将界面、逻辑和数据处理语句进行分块,各自有各自的领辖范围。那么同理,七层也是为了增加程序的可扩展性和维护性,而在U层和B层之间添加层,只是为了降低耦合关系,当U层和B层任意一个代码要发生变化时,我们只需对应的增加一下B层的逻辑、U层的界面、Facade就可以了。这样高效、省时省力何乐而不为?
这么多东西,各自的关系又是怎样的呢?怎么用?
像图中显示的那样,每一个箭头所指向的块就是被引用的对象,比如UI层引用Facade层,Facade引用BLL。而它们都要引用实体类,实体类中的东西依据用到的数据表中的字段名而建立。
有了基本了解,咱们开始让它步入正轨,进入一个在普通不过的窗体--登录的实现过程。
按照上图的思路,先从U层的界面出发,代码如下:
Public Class Login Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click Dim login As New Model.LoginModel Dim Fadlogin As New Facade.FadLogin Dim strResult As String '将界面中用户输入的数值传给LoginModel中的MuerID和MpassWord login.MuserID = txtName.Text login.MpassWord = txtPW.Text Dim workInfo As New Model.WorkInfoModel '将当前时间和日期写道数据表中对应的字段名 workInfo.MloginDateTime = DateTime.Now.ToString("yyy-mm-dd HH:MM:SS") '将“正在值班”赋值给Model中的Mstatus workInfo.Mstatus = "正在值班" workInfo.MuserID = Model.LoginModel.UserHead '获取当前机器名 workInfo.MPC = System.Net.Dns.GetHostName().ToString strResult = Fadlogin.FLogin(login, workInfo) Select Case strResult Case "输入有误" MsgBox("输入有误,请重新输入") txtName.Focus() Case "成功了" MsgBox("登录成功") Me.Hide() frmMain.Show() End Select End Sub Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click Me.Close() End Sub End Class
当U层对程序发出命令,B层开始接收命令,将U层的命令消化然后产生程序的逻辑,其实这个过程就像是领导发话下达任务是一样的,U是领导发令,B层的经理将领导的话进行加工下发给下面的每个职员:Facade、Factory和D。当所有的职员都完成自己的任务时,再将执行结果向上反馈给经理,最后告知最高领导任务的执行结果。
下面是B层的代码:
Imports IDAL
Public Class LoginBLL Public Function IsExits(ByVal user As Model.LoginModel, ByVal workInfo As Model.WorkInfoModel) As Boolean 'boolean 数据类型 boolean 变量存储为 8 位(1 个字节)的数值形式,但只能是 True 或是 False。 Dim IUser As IDAL.IUser Dim factory As New Factory.LoginFacy Dim IWorkInfo As IDAL.IWorkInfo IUser = factory.CreateUserInfo() IWorkInfo = factory.CreateWorkInfo() Dim table As New DataTable 'datatable表示一个内存中的数据 table = IUser.User_Login(user) If table.Rows.Count = 0 Then 'rows 指行,count指的是数目 '=0是指:table中的数据为0行,也就是没有数据 Return False Else
If IWorkInfo.SaveWorkInfo(workInfo) Then Return True End If Return True End If End Function End Class了解七层的用意和命令的传达的前两个过程之后,我们再来看我们的外观,我对外观的理解就是对B层逻辑的提炼,在U层和B层之间建立一个桥梁,为U层的上的“路人”--命令指引通往B层的路标。代码如下,大家体会一下是不是一个桥梁的效果:
'引入BLL的命名空间 Imports BLL Public Class FadLogin '声明一个公共变量 FLogin Public Function FLogin(ByVal user As Model.LoginModel, workInfo As Model.WorkInfoModel) As String Dim ConfirmUserBLL As New BLL.LoginBLL If ConfirmUserBLL.IsExits(user, workInfo) = False Then Return "输入有误" Else Return "成功了" End If End Function End Class
其实不管是三层还是七层都是为了在对程序修改时省时省力,也就是软件编程的属于“可扩展性”,方便后期程序的维护。如果有理解不到位或者错误的地方欢迎大家给我提意见哦,其实看着挺复杂的,但是万事开头难,当有了登录的成功实现经验和方法的总结,相信我们都可以顺利度过这个独木桥,通往阳光大道!