VB.NET三层实现实例—登录窗体

    关于三层的概念等等知识,自己通过上网搜索,以及请教同学,对于三层之间如何工作的,现在有一个初步的理解,下面是自己找的一个例子,通过这个例子,来具体理解和查看三层之间的关系和理解三层的概念。

    首先第一步就是搭建VB.NET三层架构项目的环境。具体步骤如下:

    一、创建解决方案

      1、文件→新建→项目

      2、展开其它项目类型→Visual Studio解决方案→空白解决方案

      3、起一个名字,名为Login。

    二、添加项目

      右击资源管理器中刚建的解决方案(Login)->添加->新建项目,选择Visual Basic,并且选择类库,来创建LoginModel、LoginDAL、LoginBLL,三个项目。

      添加一个Windows窗体应用程序,名字为LoginUI。同样是选择Visual Basic,只是这次选择Windows窗体应用程序。

      创建窗体后进行设计,如下图:


       这时项目基本完成,再把相应的类重命名一下就可以了。建完的图如下:

    三、环境搭建好了,下一步就该实现了,具体代码如下:

      实体层(LoginModel):由数据库中的表抽象出来的类。实体类主要作为数据的载体,在各个层之间被传递。也就是说实体是程序与数据库打交道的交集,每张数据库表作为一个实体类;每张数据库表对应一个实体类;每张表的记录对应一个实体类的对象;表中每个字段对应实体类的一个属性。

      代码如下:

<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>Public Class UserInfo
    Private _ID As Integer
    Private _Username As String
    Private _Password As String
    Private _Email As String

    Public Property ID() As Integer
        Get
            Return _ID
        End Get
        Set(ByVal value As Integer)
            _ID = value
        End Set
    End Property
    Public Property Username() As String
        Get
            Return _Username

        End Get
        Set(ByVal value As String)
            _Username = value
        End Set
    End Property
    Public Property Password() As String
        Get
            Return _Password

        End Get
        Set(ByVal value As String)
            _Password = value
        End Set
    End Property
    Public Property Email() As String
        Get
            Return _Email
        End Get
        Set(ByVal value As String)
            _Email = value
        End Set
    End Property
    '实体类的作用就是一个暂时存储数据的场所,它不等同于数据库,因为数据库中的数据是可以长久保存的,但是
    '实体层的数据却不是,通过一个new方法就可以把实体类中的数据清除掉,此外构建的实体集可以方便各个层对其进行调用。
    '使得它们之间能够更好地交互
End Class
</strong></span>

    数据访问层(DAL):DAL中的每一个类对应着数据库的一张表,所以在本例中存在两个类,UserDAO类和ScoreDAO类,那么它们肯定会有一个方法用于与数据库打交道,查询数据库,并且向其中添加信息。UserDAO的方法是SelectUser,而ScoresDAO的方法是UpdateScore。方法中包含着相应的SQL语句。用UML图表示:


    代码如下:

<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>Imports Login.Model
Imports System.Data.SqlClient
Public Class DBConstr
    'D层相当于ODBC数据源,负责连接数据库,因为D层的作用就是访问数据库
    Public Shared Function connstring() As String
        connstring = "Server=.;Database=Login;User ID=sa;Password=123456"
    End Function
End Class
Public Class ScoresDAO
    Public Sub UpdateScore(ByVal Username As String, ByVal value As Integer)
        Dim conn As SqlClient.SqlConnection
        Dim cmd As SqlClient.SqlCommand
        conn = New SqlClient.SqlConnection(DBConstr.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
Public Class UserDAO   '每登录一次,增加十个积分。插入数据的功能 
    Public Function SelectUser(ByVal userName As String, ByVal passWord As String) As Login.Model.UserInfo  '引用userinfo类的成员
        Dim con As SqlClient.SqlConnection
        Dim cmd As SqlClient.SqlCommand
        con = New SqlClient.SqlConnection(DBConstr.connstring())  '传入SQL语句
        con.Open()                    '打开连接 

        cmd = con.CreateCommand  ''在执行命令时,需要指定一个在数据源上执行的sql语句和Connection对象 

        '根据username和password查询数据
        cmd.CommandText = "select ID,Username,Password,Email from Users Where Username=@userName and Password=@passWord "
        cmd.CommandType = CommandType.Text
        '添加命令参数,@username为参数,username为参数值
        cmd.Parameters.Add(New SqlClient.SqlParameter("@userName", userName))
        cmd.Parameters.Add(New SqlClient.SqlParameter("@Password", passWord))


        Dim reader As SqlClient.SqlDataReader       '定义一次查询,用while读取每行内容 
        reader = cmd.ExecuteReader()    '执行查询(将 CommandText 发送到 Connection 并生成一个 SqlDataReader。)

        Dim user As Login.Model.UserInfo    '定义一个user,as后面是类型
        user = Nothing
        While (reader.Read())             '读取text里的内容               
            If user Is Nothing Then
                user = New Login.Model.UserInfo

            End If
            user.ID = reader.GetInt32(0)        '将第一个内容转换为32位的int类型并赋值给实体层的userinfo

            user.Username = reader.GetString(1) '将第二个内容转换为字符串类型并赋值给实体层的userinfo 
            user.Password = reader.GetString(2)
            If (Not reader.IsDBNull(3)) Then    '判断是否存在数据(也就是说,有Email就赋值进去,没有也可以。),返回bool值 
                user.Email = reader.GetString(3)
            End If
        End While
        Return user         '返回查询结果    此时返回的结果虽然在实体集中,但是其仍属于D层,故而是无法被其它层直接使用的。但是可以通过方法的调用。
    End Function
End Class</strong></span>

    业务逻辑层(BLL):在这里存在一个类LoginService,它对应着DAL层的UserDAO类及ScoresDAO类,它可以调用DAL的方法,LoginService定义一个方法,这个方法的参数是由UI层传来的的Model一个具体的实例,对其进行判断之后,将结果放在userlogin里 。

UML图表示是:


    代码:

<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>Imports Login.DAL
Imports Login.Model
Public Class LoginService
    '自定义函数,返回实体层类的数据
    Public Function userlogin(ByVal Username As String, ByVal Password As String) As Login.Model.UserInfo
        Dim uDao As New Login.DAL.UserDAO   '引用DAL层,声明必要类 实例化D层的一个类,名为uDao
        Dim user As New Login.Model.UserInfo    'B层中实体集一个新的声明类
        Dim sDao As New Login.DAL.ScoresDAO    '分数声明类
        user = uDao.SelectUser(Username, Password)  ''根据参数确定返回值,通过D层的方法SelectUser来调用D层的实体集user,并付给B层的user
        If (user Is Nothing) Then                       '返回Nothing处理
            Throw New Exception("登录失败!")
        Else
            sDao.UpdateScore(Username, 10)      '登陆成功,调用DAL加分机制             
            Return user    '返回查询结果,但是也是只是在B层的使用范围内,同D层
        End If


    End Function
End Class
</strong></span>

    表示层(UI):登录按钮按下的时候,这时会把Model里的UserInfo这个类实例化,并且实例出一个实体类,把它当作一个参数,在UI层与BLL层之间进行交互,当然如果没有在这一步实例化实体,对于参数较少的情况下,可以直接把参数写进去即可,多的话,还是实例出一个实体,将参数全部封装在实体里,这样便于参数的调用。文章中注释掉的部分就是实例化实体的代码。

    代码:

<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>Imports Login.BLL
Imports Login.DAL
Imports Login.Model


Public Class frmLogin
    '这里只负责将执行后的结果展现给用户,不能有一点点的判断过程。

    Private Sub btnLogin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLogin.Click
        Dim username As String
        Dim password As String
        'Dim user As Login.Model.UserInfo

        username = txtUsername.Text  '输入DAL.UserDAO类自定义函数参数,用来查询表中符合的数据 
        password = txtPassword.Text
        'user.Username = txtUsername
        'user.Password = txtPassword

        Dim buser = New Login.BLL.LoginService    '引入业务逻辑层的userlogin操作 实例化B层的一个类
        Dim user = buser.userlogin(username, password)      '传参   调用B层的方法userlogin,来实现调用B层得到的user

        MessageBox.Show("您好,登陆成功!登录用户:" + username)
        'If buser.userlogin(user) Then
        '    MsgBox(True)
        'Else
        '    MsgBox(False)

        'End If

    End Sub
End Class
</strong></span>

    总结:三层以及实体层之间的关系总结如下:


    通过上面的代码,以及层与层之间的关系,我们得出了结论,那就是三层架构的特点就是达到了高内聚和低耦合。我们可以看出UI依赖于BLL层,BLL层依赖于DAL层。UI层可以调用BLL的方法,只需要在自己的登录按钮实例出一个BLL层类的一个实例即可,不知道BLL层究竟是怎么具体实现的,当然BLL层也不知道UI层的存在,只是UI层需要BLL层的时候才去调用,不需要的时候,就不去管它了,当然BLL层与DAL层也是这样的,所以它们的开发便不会相互影响,方便使用。而实体层是它们在交互时的一个传递参数,在它们之间进行着。

    我们总结的结果就是:

    UI层,为用户界面,负责与用户打交道。只负责显示和采集用户操作,用于显示数据和接收用户输入的数据,为用户提供一种交互式操作的界面。不包含任何业务相关的逻辑处理。

    BLL层:负责处理业务逻辑,是架构中的核心,处于数据访问层与表示层中间,起到了数据交换中承上启下的作用。通过获取UI传来的操作指令,决定执行业务逻辑,在需要访问数据源的时候直接交给DAL处理,处理完成后,返回必要数据给UI。

    DAL层:只提供基本的数据访问,与数据源打交道:取数据、写数据、删数据(增(Insert)、删(Delete)、查(Select)、改(Update))。将这些操作封装成函数以供调用即可。

    Model:实体类,负责三层之间的数据传递。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 19
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值