机房重构有半个月,虽说数据库都没有连好呢,但是在各种调试的过程中对三层架构又多了一些了解.
在开始三层架构的总结之前先看一看vb版的过程,看看界面和数据库的关系。
下面是登录界面的部分代码<span style="font-size:18px;"> If miCount = 3 Then MsgBox "您已经超过登录次数,系统将退出", , "提示" Unload Me Else <span style="color:#ff0000;"> txtsql = "select * from worklog_Info where userID= '" & Trim(txtUser.Text) & "'and status= 'true'" </span>Set mrc = ExecuteSQL(txtsql, MsgText) If mrc.RecordCount <> 0 Then MsgBox "该用户已经登录", , "提示" txtUser.Text = "" txtUser.SetFocus txtPWD.Text = "" Exit Sub End If</span>
在vb版的机房收费系统中,界面是直接对数据库进行操作的。但是到了面向对象的程序设计后,又有了一种更合理的操作方式---------三层架构
对三层架构的理解就是减少耦合,不让数据库和界面直接发生关联。
为了不发生直接发生关联,三层是怎么做的呢。
一个个人认为很经典的例子。就是去饭店吃饭例子。传统的vb版的机房收费系统就好比自己在家做饭,自己买菜自己做。而三层就是是去饭店吃饭,你告诉服务员你
要吃什么,服务员告诉厨师要做些什么,厨师把菜做好了,就由饭店端上来。我们就负责吃就好了。这样如果服务员态度不好,可以换服务员,如果厨师做饭不好吃
就换厨师,之间不会相互影响,只要保证接口一样就可以了。
对于三层,就是UI层,BLL层,DAL层。
Ui层:用于显示数据和接收用户输入的数据,为用户提供一种交互式操作的界面。
BLL层:主要是针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理,如果说数据层是积木,那逻辑层就是对这些积木的搭建。
DAL层:主要是对原始数据(数据库或者文本文件等存放数据的形式)的操作层,而不是指原始数据,也就是说,是对数据的操作,而不是数据库,具体为业务逻辑层
或表示层提供数据服务
Entity层:实体层,不属于三层之中,但是也是很关键的一层,它用来对数据进行封装。U层得到这个实体后,把这个“箱子”“打开“,从里面得到自己想要的数据。
使用
实体层还可以避免三层之间的相互引用,
从图中来看,黄色的箭头是实体从U层向D层传递,这时实体中的数据是很少的,一般就只有用来查询的关键字,在红色部分访问数据库之后,就有了更多
的数据。
下面就看一看三层是怎么体现这种关系的(引用的代码只是用来体现三层之间的调用关系,所以并没有判断数据是否有效等逻辑判断的代码)
首先是D层。
<span style="font-size:18px;">Public Class UserDAO Public Function SelectUser(ByVal user As loginUser) As loginUser Dim conn As New SqlConnection Dim cmd As New SqlCommand Dim connstr As String <span style="color:#ff0000;">connstr = "server=.;database=JFSFXT;User ID=sa;password=123456;" conn = New SqlConnection(connstr) cmd.Connection = conn cmd.CommandText = "Select * From UserInfo where ID=@ID And PassWord=@Password"//在D层中负责访问数据的代码</span> cmd.Parameters.Add(New SqlParameter("@ID", user.Username)) cmd.Parameters.Add(New SqlParameter("@password", user.Password)) cmd.CommandType = CommandType.Text conn.Open() Dim reader As SqlDataReader = cmd.ExecuteReader Dim nuser As New loginUser While reader.read() <span style="color:#ff9900;">nuser.level = reader.GetString(3)//将数据库中的数据,赋值给实体</span> End While <span style="color:#ff0000;">Return nuser//将带有数据的实体返回给BLl层</span> conn.Close() End Function End Class</span>
然后是B层的代码
<span style="font-size:18px;">Public Class BLogin Public Function login(ByVal user As loginUser) As loginUser Dim LoginUser As New loginUser//定义一个实体 Dim SelectUser As New UserDAO <span style="background-color: rgb(204, 204, 204);"><span style="color:#ffffff;"> </span><span style="color:#ff0000;">LoginUser = SelectUser.SelectUser(user)//调用D层的方法,将D层返回的实体赋值给LoginUser</span></span> Return LoginUser//返回实体给U层 End Function End Class</span>
最后是U层的代码
<span style="font-size:18px;">Public Class frmLogin Private Sub butOK_Click(sender As Object, e As EventArgs) Handles butOK.Click Dim user As Entity.loginUser Dim user2 As New loginUser Dim login As New BLogin user = New loginUser user.Username = txtUser.Text.Trim//将用户输入的用户名,传给实体 <span style="color:#ff0000;"> user2 = login.login(user)//调用B层的方法,并将返回的实体赋值给User2</span> txtLevel.text=user2.level //将实体中的数据,赋值到窗体控件中 frmMain.Show() Me.Hide() End Sub</span>
但从代码上来说,VB是界面直接使用访问数据库的SQL语言,而在三层中,就是一个嵌套中再加一个嵌套,U层要执行SQL语言,在U层中调用B层的一个方法,
而调用的这个B层的方法中又调用了一个D层的方法,在D层中就是访问数据库的代码了。从代码上来时就是一个调用的过程。
三层的优劣
从每个方法的形参中可以看到,使用实体写一个形参就可以了,如果一个方法,需要多个数据的话,我们要写多个形参,这样就很麻烦,还容易写错。
这就是使用实体的一方面的好处。
另外,这么做降低了耦合,让我们的代码修改起来就相对方便一些。
至于有待提高的地方,就是这样会影响软件的性能。本来是直接使用,而现在却要调来调去,对性能是有一些影响的。
但是,这么做事值得的,在牺牲一点性能的情况下,提高代码的可修改性。
这就是我对三层的一点理解。