目录
三层就是把各个功能模块划分为表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)三层架构,各层之间采用接口相互访问,并通过对象模型的实体类(Model)作为数据传递的载体,不同的对象模型的实体类一般对应于数据库的不同表,实体类的属性与数据库表的字段名一致。
简单的点来说:就是高内聚,底耦合的思想,不会牵一发而动全身。
生活中饭店的例子来举例,大家可能会更理解一些。

:服务员只管接待客人
:厨师只管烹炒客人要的菜系
:采购员只管按照客人的需求来采购食材
各司其职,共同协作为客人提供美食
问题:
为什么要需要这三种角色,为什么不合在一起,每个角色的功能的是分离的
举例:
服务员离职、请假→其他服务员代替
厨师离职→其他厨师代替
采购员离职→其他采购员代替
为什么能够替代,每个人的功能是一致,角色不行了替代就可以,如果合在一起就不好找人了。

三层从生活到软件,不会因为谁的不在或离职,从而工作停掉,三层在软件中易是如此,每个层都有特定的职责和功能,不会因为需求改动从而需要修改整个系统,只需改其中一层的的代码,通过这种方式实现代码的模块化和维护性这就是所谓的三层
包图用于描述逻辑架构—层、子系统、包等,所以拿包图在合适不过了。





- Public Class eUserLogin
- Private strUserNo As String '定义一个私有字段,该字段的类型为String
- Private strPassword As String '
- Public Property Password() As String
- Get '获取属性值
- Return strPassword '返回strPassword的字符串变量的值
- End Get '结束方法
- Set(value As String) '接收一个名为"value"的字符串类型的参数
- strPassword = value '传递给StrPasswrod的字符串变量
- End Set '结束方法
- End Property
-
- Public Property UserNo() As String
- Get
- Return strUserNo
- End Get
- Set(value As String)
- strUserNo = value
- End Set
- End Property
- End Class
-
- Imports System.Xml
- Imports Login.DAL
-
- Public Class LoginBLL
- 'UserInfo用来承载登录时输入的用户名和密码,全局实体
- Public Function login(ByVal UserInfo As Entity.eUserLogin) As Entity.eUserLogin
- '实例化D层
- Dim dLogin As New Login.DAL.UserInfoDAL
- '定义B层的返回实体
- Dim bUserInfo As New Entity.eUserLogin
- '调用D层SelectUser方法
- bUserInfo = dLogin.SelectUser(UserInfo) '执行一个名为SelectUser的方法,并将其返回值赋给"bUserInfo"的布尔型变量
-
- If (bUserInfo.UserNo Is Nothing Or bUserInfo.Password Is Nothing) Then '判断bUserInfo.UserNo和bUserInfo.Password是否为空
- Throw New Exception("用户名或密码错误,请查看") 'True返回消息
- Else
- MsgBox("登录成功,请稍后", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "提示")
- Return bUserInfo 'False 返回消息
- End If
- End Function
- End Class
- '单建了一类来放数据库连接
- Imports System.Data.SqlClient
-
- Public Class LinkeDAL
- Public Shared Function connstring() As String
-
- '连接数据库字符串
- connstring = "Server= 192.168.96.71;Database=cybercafe;User ID=sa;Password=123456;"
- End Function
- End Class
-
-
- Imports System.Data.SqlClient
- Imports Login
- Public Class UserInfoDAL
- Public Function SelectUser(UserInfo As Entity.eUserLogin) As Entity.eUserLogin
- Dim conn As New SqlConnection(LinkeDAL.connstring)
- '打开数据库
- conn.Open()
- '创建一个名为"reader"的SqlDataReader对象
- '(SqlDataReader)是一种.NET Framework中的数据读取器,用于从Microsoft SQL Server数据库中读取数据
- Dim reader As SqlDataReader
- 'D层实例化执行查询后返回实体
- Dim duserInfo As New Entity.eUserLogin
- '查询语句
- Dim sql As String = "Select * from User_Info where UserNo=@UserNo and Password=@Password"
- '创建一个名为"cmd"的SqlCommand对象,并将其初始化指定的SQL语句和数据库连接对象。
- 'SqlCommand是一个.NET Framework中的类,用于执行SQL语句并返回查询结果
- Dim cmd As New SqlCommand(sql, conn)
- '向SQL语句添加一个命名参数,就将"@UserNo"的参数添加一个值,这个值来自一个名为UserInfo的对象
- '@符作为参数的前缀,可以让SQL语句更容易区分参数和普通参数的文本。同时,@符号可以让SQL语句更易于阅读和理解
- cmd.Parameters.Add(New SqlParameter("@UserNo", UserInfo.UserNo))
- cmd.Parameters.Add(New SqlParameter("@Password", UserInfo.Password))
- '执行查询语句并将结果以DataReader对象的形式返回,以供后续的数据处理和操作
- reader = cmd.ExecuteReader()
- '循环语句它会在SqlDataReader对象中有下一行数据时执行,在每次循环中,我们将使用SqlDataReader对象的一些方法(如GetString、GetInt32等)来获取当前行的数据,并将其存储在相应的变量中。
- While (reader.Read())
- '循环来逐行查询结果。每次循环中,我们使用read.GetString()来获取查询结果中第一列的字符串,并赋值给duseInfo对象的UserNo属性
- duserInfo.UserNo = reader.GetString(0)
- duserInfo.Password = reader.GetString(1)
- End While
- Return duserInfo
- conn.Close() '关闭数据库
- End Function
- End Class
- Imports System.Xml
-
- Public Class Form1
- Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click '单击事件
-
- Try
- '实例化传实体的对象
- Dim UserInfo As New Entity.eUserLogin
-
- '将用户名和密码放入实体,文本框中的字符串去除空格并赋给实体对象UserInfo,使实体对象能够带上参数
- UserInfo.UserNo = txtUserName.Text.Trim()
- UserInfo.Password = txtPassWord.Text.Trim()
- '判断账号否为空
- If txtUserName.Text = "" Then
- MsgBox("用户名不能为空!", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "提示")
- Return
- End If
- '判断密码是否为空
- If txtPassWord.Text = "" Then
- MsgBox("密码不能为空!", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "提示")
- Return
- End If
- '定义一个最终的返回体,returnUserInfo,承接经过D层查询,B层判断的登录信息
- '实例化BLL层的对象
- Dim bLogin As New LoginBLL.LoginBLL
- '调用B层的方法login
- bLogin.login(UserInfo)
- Catch ex As Exception '处理异常的代码
- MessageBox.Show(ex.Message.ToString) '返回一个字符串,表示异常的详细信息
- End Try '方法结束
- End Sub
- Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click
- End
- End Sub
- End Class
-
对于三层的理解还不是很透彻,还是需要多实践,理论明白了并不代表真正意义上的明白。