通过学习三层架构(-)中整体了解三层架构的一些基础和理论知识,此篇文章开始继续谈谈三层的学习.主要是谈谈三层的入门.
一、 整体把控三层的概念
界面层(UI) 业务处理层( BLL) 数据层(DAL) 数据库处理器(DBHelper) 实体类(Entity) 这是系统最基本的框架,他们之间的关系可以用以下包图来表示。
注:每个包代表一层,在程序中代表一个命名空间或者说是一个类库。
要遵循一个三层最基本的原则:不能跨层调用。各层之间通过参数来传递,也就是实体类。
这里强调一个个人观点:基于面向对象的思想,各层之间的参数都是封装到相应的实体类。传递参数都是传实体类对象。对于简单的参数可能这样稍微麻烦些。
二、 实行各个突破原则进一步加深对三层的理解(这里以登陆为例)。
1. 从实体类开始入手,实体类与数据库一一对应,每个表对应一个实体类。
开始数据库的设计,画实体类的类图(这里我采用的是rose画图工具),如图所示:
2. 设计界面(略),搞清楚输入参数是什么,输出参数是什么。更具这些需要去设计相对应的DAL层。
3. 其次是DBHelper,连接数据库,以及对数据库的处理。主要是把一些常用的函数封装到一个包中,实现复用。在网上会找到好多资料。
这里我推荐一个自认为还不错的代码。
Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration
Imports System
Public NotInheritable Class sqlHelper
Private Shared ReadOnly instance As sqlHelper = New sqlHelper()
Private Sub New()
End Sub
Public Shared Function GetInstance() As sqlHelper
Return instance
End Function
Private Shared con As SqlConnection
Public Shared ReadOnly Property Conn() As SqlConnection
Get
If con Is Nothing Then
con = New SqlConnection(ConfigurationManager.AppSettings("connstr"))
con.Open()
ElseIf con.State = ConnectionState.Closed Then
con.Open()
ElseIf con.State = ConnectionState.Broken Then
con.Close()
con.Open()
End If
Return con
End Get
End Property
Public Function GetTable(ByVal safeSql As String) As DataTable
Dim dt As New DataTable()
Dim da As New SqlDataAdapter(New SqlCommand(safeSql, Conn))
da.Fill(dt)
Return dt
End Function
Public Function GetTablePar(ByVal safeSql As String, ByVal ParamArray values As SqlParameter())
Dim dt As New DataTable()
Dim cmd As New SqlCommand(safeSql, Conn)
cmd.Parameters.AddRange(values)
Dim da As New SqlDataAdapter(cmd)
da.Fill(dt)
Return dt
End Function
Public Function GetScalarPar(ByVal safeSql As String, ByVal ParamArray values As SqlParameter())
Dim cmd As New SqlCommand(safeSql, Conn)
cmd.Parameters.AddRange(values)
Return cmd.ExecuteNonQuery()
End Function
Public Function GetScalar(ByVal safeSql As String) As Integer
Dim cmd As New SqlCommand(safeSql, Conn)
Dim result As Integer = cmd.ExecuteNonQuery()
Return result
End Function
执行存储过程
Public Function ExecuteProc(ByVal procName As String, ByVal ParamArray values As SqlParameter()) As Integer
Dim cmd As New SqlCommand(procName, Conn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddRange(values)
Return cmd.ExecuteNonQuery()
End Function
End Class
4. 接下来是DAL层,数据处理层,主要是对数据库表的操作(增删改查)。
DAL层中的类与数据库中的表一一对应,每个表对应一个DAL中的类。每个类实现增删改查四个方法,实体类当参数。DAL层调用DBHelper。以查询用户表为例
Public Function QueryName(ByVal User As Entity.User) As System.Data.DataTable Implements IDal.IUser.QueryName
Dim Sql As String = "select * from User1 where UserName='" & User.UserName & "'"
Dim dt As DataTable = sqlHelper.GetInstance().GetTable(Sql)
Return dt
End Function
5. DAL层完成之后,下一步主要是BLL层,需要进行的逻辑判断,根据UI层传递的参数,来调用对应的DAL层。返回信号给UI层。
总结一下:搞清楚每层的任务和之间的关系,这里关键在于如何通过实体类或参数才实现更层之间的传递。这是我个人认为比较难的一部分。我采取的方法是做了一个小的登陆DEMO ,完整的实现了一条线。大家可以借鉴一下。
此篇文章主要介绍我学习三层时的过程,有不足的地方请读者提出来。待续、、、、、、、、、、、、、、、、、、
下面是一个登陆的小例子,大家可以实战练习一下。做完之后相信大家对三层会有一个比较清新的理解。
1: Public Class Login
2: Private Sub btnLogin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLogin.Click
3: Dim LUser As New Entity.User
4: Dim BCheck As New BLL.B_Login
5: LUser.User_ID = txtName.Text
6: LUser.User_Pwd = txtPwd.Text
7: If BCheck.Check(LUser) = True Then
8: MsgBox("登录成功!")
9: Else
10: MsgBox(“"登录失败!")
11: End If
12: End Sub
13:
14: Private Sub btnCancle_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancle.Click
15: End
16: End Sub
17: End Class
业务逻辑层
1: Public Class B_Login
2: Function Check(ByVal User As Entity.User) As Boolean
3: Dim DaUser As New DAL.D_UserInfo
4: Dim BlUser As New Entity.User
5: Bluser.User_ID=User.ID
6: BlUser = DaUser.Check(BlUser)
7: If BlUser.User_Pwd = User.User_Pwd Then
8: Return True
9: Else
10: Return False
11: End If
12: End Function
13: End Class
数据持久层
1: Imports System.Data.SqlClient
2: Public Class D_UserInfo
3: Dim ConnStr As String = "Data Source=******;Initial Catalog=Student;User ID=sa;Password=******"
4: Dim conn As SqlConnection = New SqlConnection(ConnStr)
5: Function Check(ByVal User As Entity.User) As Entity.User
6: Dim sql As String = "select * from UserInfo where UserInfo=" & User.User_ID
7: Dim cmd As SqlCommand = New SqlCommand(sql, conn)
8: Dim read As SqlDataReader
9: Try
10: conn.Open()
11: read = cmd.ExecuteReader
12: User.User_ID = read.Item(0)
13: User.User_Pwd = read.Item(1)
14: Return User
15: Catch ex As Exception
16: User.User_Pwd = ""
17: Return User
18: End Try
19: End Function
20: End Class