三层架构——实践篇(小Demo,大道理)

       上篇说道三层的基础理论知识,这里将以一个小的登录Demo来进行实践练习。

      应用原则:DALUI不包含任何业务逻辑处理。

                 BLL通过UI传来的指令,决定执行业务逻辑,需访问数据源时交DAL处理。完成后返回数据给UI。

                 DAL/UI/BLL应在不同Assembly中,开放扩展、关闭修改。

       实现功能:利用三层架构实现简单的用户登录,并对登录成功的用户设置增加积分的功能。

       实现语言:VB.NET

       建立数据库Login 该实例仅用到两个表

            Users,包含字段:IDUsernamePasswordEmail

            Scores,包含字段:IDUsernameScore

数据模型(Data Model)

      创建LoginModel程序集,创建封装用户信息数据类,该类不属于特定层次,而是专用于封装数据,方便各层访问。UserInfo类封装表Users返回的各字段,该程序集被各层次引用,但哪个层次都不引用。

Public Class UserInfo
    Private _ID As String
    Private _Username As String
    Private _Password As String
    Private _Email As String
Public Property ID As Integer                 '属性ID
        Get
            Return _ID
        End Get
        Set(value As Integer)
            _ID = value
        End Set
    End Property
    Public Property Username As String      '属性Username
        Get
            Return _Username
        End Get
        Set(value As String)
            _Username = value
        End Set
    End Property
    Public Property Password As String      '属性Password
        Get
            Return _Password
        End Get
        Set(value As String)
            _Password = value
        End Set
    End Property
    Public Property Email As String             '属性Email
        Get
            Return _Email
        End Get
        Set(value As String)
            _Email = value
        End Set
    End Property
End Class

DAL分析:

   1.创建连接数据库类DoUtil,方便之后各类连接数据库调用,对今后若更换数据库提供方便。

Public Class DoUtil
    Public Shared Function connstring() As String
        connstring = "Server=计算机名;Database=Login;User ID=sa;Password=123456"
    End Function
End Class

  2.创建数据访问对象UserDAO,访问表Users,返回符合条件调用。

Public Class UserDAO
    '定义选择用户函数,按传入参数返回Users表中指定记录
    Public Function SelectUser(ByVal userName As String, ByVal password As String) As LoginModel.UserInfo
        Dim con As SqlClient.SqlConnection
        Dim cmd As SqlClient.SqlCommand
        con = New SqlClient.SqlConnection(DoUtil.connstring())                  '连接数据库
        cmd = con.CreateCommand()

'根据用户名和密码选中记录内容
        cmd.CommandText = "select ID,Username,Password,Email from Users Where Username=@userName and Password=@password"  
        cmd.CommandType = CommandType.Text

'添加命令参数 
       cmd.Parameters.Add(New SqlClient.SqlParameter("@userName", userName))
        cmd.Parameters.Add(New SqlClient.SqlParameter("@Password", password))
        con.Open()                    '打开连接
        Dim reader As SqlClient.SqlDataReader
        reader = cmd.ExecuteReader()    '执行查询
        Dim user As LoginModel.UserInfo
        user = Nothing
        While (reader.Read())             '读取字段
            If user Is Nothing Then
                user = New LoginModel.UserInfo
            End If
            user.ID = reader.GetInt32(0)
            user.Username = reader.GetString(1)
            user.Password = reader.GetString(2)
            If (Not reader.IsDBNull(3)) Then
                user.Email = reader.GetString(3)
            End If
        End While
        Return user         '返回查询结果
    End Function
End Class


3.创建数据库访问对象ScoreDAO,访问表Scores,对于登录成功的用户插入分数记录。

Public Class ScoreDAO
    Public Sub UpdateScore(ByVal Username As String, value As Integer)
        Dim conn As SqlClient.SqlConnection
        Dim cmd As SqlClient.SqlCommand
        conn = New SqlClient.SqlConnection(DoUtil.connstring)  '连接数据库
        cmd = conn.CreateCommand()                                                '创建插入命令
        cmd.CommandText = "Insert INTO Scores(Username,Score) Values (@Username,@Score)"       '插入字符串
        cmd.Parameters.Add(New SqlClient.SqlParameter("@Username", Username)) '创建参数Username
        cmd.Parameters.Add(New SqlClient.SqlParameter("@Score", value))      '创建参数value
        conn.Open()           '打开连接
        cmd.ExecuteNonQuery()   '执行插入命令
        conn.Close()
    End Sub
End Class

BLL分析:

       创建登录类,实现登录过程的逻辑处理

Public Class LoginService
    Public Function userlogin(Username As String, Password As String) As LoginModel.UserInfo      '定义登录函数,返回UserInfo类
        Dim uDao As New Login.DAL.UserDAO    '引用DAL层,声明必要类
        Dim user As New LoginModel.UserInfo
        Dim sDao As New Login.DAL.ScoreDAO
        user = uDao.SelectUser(Username, Password)         '根据参数确定返回值
        If (user Is Nothing) Then                       '返回Nothing处理
            Throw New Exception("登录失败。")
        Else   
'登录成功,插入10至分数字段并返回UserInfo类
            sDao.UpdateScore(Username, 10)
            Return user
        End If
    End Function
End Class

UI分析:

         1.创建系统登录界面

三层架构——实践篇(小Demo,大道理)_第1张图片

        2.编写登录事件代码

Public Class frmLogin
Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
        Dim username As String
        Dim password As String
        username = txtUsername.Text  '根据用户输入,引入参数
        password = txtPassword.Text
                 Dim ser = New Login.BLL.LoginService  '引用BLL层,执行登录逻辑处理
        Dim user = ser.userlogin(username, password)
        MessageBox.Show("登录用户:" + username)
    End Sub
End Class

      此项目就此完成,虽实现功能简单,但可充分体现三层架构设计的思想。将系统模块列于此:

三层架构——实践篇(小Demo,大道理)_第2张图片

      小结:

      三层架构用于用户业务逻辑复杂且需要存储数据的系统构建,其目的主要是降低系统之间耦合,根据各个层次之间的引用,开发者可各层关注来予以各个层次的设计,明显改善系统的可维护性,增强系统优化的目的性。


你可能感兴趣的:(三层架构——实践篇(小Demo,大道理))