机房重构——三层架构

  机房重构有半个月,虽说数据库都没有连好呢,但是在各种调试的过程中对三层架构又多了一些了解.

在开始三层架构的总结之前先看一看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版的机房收费系统中,界面是直接对数据库进行操作的。但是到了面向对象的程序设计后,又有了一种更合理的操作方式---------三层架构

         对三层架构的理解就是减少耦合,不让数据库和界面直接发生关联。

为了不发生直接发生关联,三层是怎么做的呢。

一个个人认为很经典的例子。就是去饭店吃饭例子。传统的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层中就是访问数据库的代码了。从代码上来时就是一个调用的过程。

三层的优劣

从每个方法的形参中可以看到,使用实体写一个形参就可以了,如果一个方法,需要多个数据的话,我们要写多个形参,这样就很麻烦,还容易写错。

这就是使用实体的一方面的好处。

        另外,这么做降低了耦合,让我们的代码修改起来就相对方便一些。

至于有待提高的地方,就是这样会影响软件的性能。本来是直接使用,而现在却要调来调去,对性能是有一些影响的。

       但是,这么做事值得的,在牺牲一点性能的情况下,提高代码的可修改性。


       这就是我对三层的一点理解。



你可能感兴趣的:(三层架构,机房重构,vb.ne)