今天来说一下三层架构,想必学过三层架构的有志之士都知道我所说的不是物理上的三层架构,而是业务逻辑上的三层架构。三层架构层次化分为表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。
这里我先说一下刚开始接触三层时的感受啊,刚开始学习三层架构时有点蒙。至于蒙的原因嘛?就是不知道各层次间到底是怎么串联起来的。
下面转入正题:
三层架构的区分层次的目的即为了“高内聚,低耦合”的思想。其中
表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。
业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。
数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等。
下面通过一个vb.NET编写系统登录的小例子将三层之间的联系简单说明一下。
D层:
Imports System.Data.sqlClient Imports System.Data Public Class UserDAL Public Function SelectUser(ByVal users As UserEntity.LoginEntity) As UserEntity.LoginEntity '查询用户 Dim com As New sqlCommand '定义命令字符串 Dim conn As New sqlConnection '定义打开连接数据库 Dim myName As String '定义个用户名接受变量 conn = New sqlConnection(Dbutil.strConnstring()) '实例化连接字符串 com.Connection = conn '将字符串连接赋给COM命令 'com.CommandText = "select * from T_User where PassWord=@PassWord and UserName=@UserName" com.CommandText = "select password from T_User where UserName=@UserName" com.CommandType = CommandType.Text '命令类型,默认是sql语句 com.Parameters.Add(New sqlParameter("@UserName",users.Luser)) '将实体给@UserName 'com.Parameters.Add(New sqlParameter("@PassWord",users.Lpassword)) '将实体给@PassWord conn.Open() '打开数据库 Dim Reader As sqlClient.sqlDataReader '定义读取数据表 Reader = com.ExecuteReader() '执行读取 Dim luserName As New UserEntity.LoginEntity '实例化实体类 While (Reader.Read()) luserName.Luser = Reader.GetString(Reader.GetOrdinal("UserName")) luserName.Lpassword = Reader.GetString(Reader.GetOrdinal("PassWord")) End While conn.Close() '关闭连接 Return luserName '将LuserName返回给实体 End Function End Class
Imports System.Data.sqlClient Imports System.Data Public Class Dbutil '连接数据库 Public Shared Function strConnstring() As String strConnstring = "server=192.168.24.150;Database=LoginUsre;User ID=sa;PassWord=123456" End Function End Class
B层:
<span style="font-size:14px;">Imports System.Data Imports System.Data.sqlClient Public Class HandleBLL Public Function UserLogin(ByVal users As UserEntity.LoginEntity) As UserEntity.LoginEntity Dim uDal As New LoginADL.UserDAL() '实例化D层 ' Dim sDal As New LoginADL.scoreDAL() Dim eDAL As New UserEntity.LoginEntity() eDAL = uDal.SelectUser(users) '查询数据表中是否有实体记录 If IsNothing(eDAL.Luser) Then '如果没有 Throw New Exception("登录失败") Else '如果有记录 MsgBox("登录成功" + eDAL.Luser) 'sDal.UpataUserscore(eDAL,10) End If Return eDAL '返回查询 End Function End Class</span>
u层:
Public Class Form1 Private Sub Btok_Click(sender As Object,e As EventArgs) Handles Btok.Click Try Dim Euser1 As New UserEntity.LoginEntity() '定义一个接收表现参数 Dim Euser2 As New UserEntity.LoginEntity() '定义一个接收判断实体返回参数 Dim mgr As New LoginBLL.HandleBLL() '实例B层 Euser1.Luser = txtUserName.Text.Trim() '接收表现层用户名 Euser1.Lpassword = txtPassWord.Text '接受密码 Euser2 = mgr.UserLogin(Euser1) '调用B层,做判断 Catch ex As Exception MessageBox.Show(ex.Message.ToString()) End Try End Sub End Class
E层(实体):
<span style="font-size:14px;">Public Class LoginEntity Dim UserName As String Dim PassWord As String Dim score As Integer Public Property Luser() As String Get Return UserName End Get Set(value As String) UserName = value End Set End Property Public Property Lpassword() As String Get Return PassWord End Get Set(value As String) PassWord = value End Set End Property End Class</span>
下面说一下三层架构的优缺点:
优点:高可扩展性、可维护性高、有利于标准化、代码可重用、还提高了系统的安全性。
缺点:代码量多、工作量大、系统比较复杂,运行效率低。