三层演义

   窗外不知是什么重物从数理楼对面的5号宿舍楼飞落,想起落下帷幕的三层。

       传说中有《三国演义》,没有赶上那一个好时代,但遇到了三层演义的好时光,真是每个断点都有不同的传奇呀。先说说有趣的故事:最近的这个三层周里,一个支架撑起C++考试层、架起汉语言毕业论文开题答辩层、And go开始三层登录模式。

       三层架构是软件设计的主要思想。对于初学者来说我们要理清这样一个思路:什么是三层?为什么要使用三层?三层在代码中是如何体现的?

       首先,三层一般来说指的是显示层(UI)、业务逻辑层(BLL)和数据访问层(DAL),它们之间是一种直接间接联系的关系:UIDAL就像是一对仇人互补说话,需要通过BLL这个中间大好人去调节,如图:


 用序列图可以表示为:


看起是不是比较难理解,那么我们举一个简单或许不太恰当的例子,那古代的平民--大臣--皇帝与奏折的关系来说:一般来说普通百姓是见不到皇上的,大臣处于皇帝和平民之间是他们的沟通桥梁,其中奏折是一个主要的实体。如图:


      通过这样的了解,我想对三层有了一个比较清晰的概念。那么第二个问题就是:为什么要使用三层?我理解的就是:


       在代码中是如何体现三层的呢?

     U层:

Public Class Form1

    Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
        Try
            Dim eUserB As New Model.UserInfo   '实例化新的UserInfo对象,用来传递B层实体
            'Dim eUserU As New Model.UserInfo      '定义一个类型为UserInfo的参数,用来赋值

            eUserB.UserName = txtUserName.Text.Trim   '将用户名传给实体层的UserName  
            eUserB.Pwd = txtPassword.Text              '将密码传给实体层的UserName  

            '调用B层,登录判断  
            Dim mgr As New BLL.LoginManager
            eUserB = mgr.SelectUser(eUserB)

        Catch ex As Exception
            MessageBox.Show(ex.Message.ToString())
        End Try
    End Sub
End Class
    B层:

Public Class LoginManager
    Public Function SelectUser(ByVal User As Model.UserInfo) As Model.UserInfo
        Dim uDao As New DAL.UserDAO    '实例化D层中新的UserDAO对象  
        Dim eUserD As New Model.UserInfo   '定义一个类型为实体层UserInfo的参数,用于赋值 
        eUserD = uDao.SelectUser(User)

        '判断是否查询到记录,若有,登录成功,并返回实体User1  
        If IsNothing(eUserD.UserName) Then
            Throw New Exception("登录失败,请检查用户名和密码!")
        Else
            MsgBox("登录成功,马上进入系统!")
            Return eUserD
        End If
    End Function
End Class
    D层:

Imports System.Data.SqlClient   '引用命名空间
Imports System.Data


Public Class UserDAO
    '创建数据库
    Public conn As New SqlConnection("Server=(Local);Database=;User ID=sa;Password=123456")
    '传UserInfo实体,而不是参数UserName等,方便对实体中的参数调用
    Public Function SelectUser(ByVal User As Model.UserInfo) As Model.UserInfo
        Dim reader As SqlDataReader   '定义类型为SqlDataReader的变量reader 
        Dim eUser As New Model.UserInfo  '实例化新的UserInfo  

        '其实下面的这段程序就相当于dim sql as string ="select  ID,UserName,PWD From Users Where UserName='"User.UserName"' And PWD='"User.PWD"'"  
        '而写成这个程序块是为了防止Sql注入,即安全性考虑。  
        '@UserName相当于传了一个参数,("@UserName", User.UserName)相当于给参数名字传递了参数。  
        Dim sql As String = "SELECT userName,Password From Login Where UserName=@UserName AND Password=@Password"
        Dim cmd As New SqlCommand(sql, conn)   '创建sqlCommand对象
        cmd.CommandText = sql                  '获取sql语句的具体内容  
        cmd.CommandType = CommandType.Text     '获取上述SQL语句的具体类型,在此为Select  
        cmd.Parameters.Add(New SqlParameter("@UserName", User.UserName))    '若用成eUser.UserName则会出现参数未传递的错误提示
        cmd.Parameters.Add(New SqlParameter("@Password", User.Pwd))

        conn.Open()                            '打开数据库连接
        reader = cmd.ExecuteReader             '执行查询语句,并生成一个DataReader  

        '读取查询到的数据,并返回给相应的属性
        While reader.Read
            '获取数据库中相应字段的数据  
            '数组必须从零开始读取,否则会超出其界限
            eUser.UserName = reader.GetString(0)
            eUser.Pwd = reader.GetString(1)
        End While
        Return eUser          '返回查询到的实体
        conn.Close()          '关闭连接 
    End Function
End Class
    实体类:

Public Class UserInfo

    Private _username As String
    Public Property UserName As String
        Get
            Return _username
        End Get
        Set(value As String)
            _username = value
        End Set
    End Property

    Private _pwd As String
    Public Property Pwd As String
        Get
            Return _pwd
        End Get
        Set(value As String)
            _pwd = value
        End Set
    End Property

End Class
           总的来说,三层架构中实体类(Entity)用于存放数据,显示层(U)用于接受用户信息和显示信息、业务逻辑层(B)用于进行业务逻辑处理、数据访问层(D)用于数据的增删改查,BUD的沟通桥梁。各司其职的三层需要在代码的弹跳中理解它们的相互联系,别有一番风味在心头。   

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 71
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 71
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值