学习三层架构(二)-从零开始

 

 通过学习三层架构(-)中整体了解三层架构的一些基础和理论知识,此篇文章开始继续谈谈三层的学习.主要是谈谈三层的入门.

一、     整体把控三层的概念

界面层(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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值