zoukankan      html  css  js  c++  java
  • 三层登录实例VB.NET版具体解释---理论加实战篇

            层,百度百科这样解释,首先-重叠起来的东西;重叠起来的东西中的一部分:层次|表层|大气层。其次-重叠。反复:层峦叠嶂|层出不穷。最后-量词,用于能够分出层次的事物。女孩儿强烈的第六感,三层中的层一定是第三个意思,三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据訪问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。

            接下来,以登录为例。结合分层,总结一下在这个小样例中的所思所想。首先,来看一下,数据在三层中的一个详细走向,各层之间关系例如以下所看到的:

            

           首先,我们须要知道各个层之间的引用关系。U层直接引用B层,间接引用D层;B层引用D层,D层不须要引用U层和D层,三层均须要引用实体层。明明说好的三层为什么另一个实体层呢?这里简单说一下,实体类。也就是把数据库表的字段映射为你的对象的各个属性。

            如我们如今敲得登录实例,User这张表,里面有ID,UserName,Password,等属性,我就须要在实体里面新建一个类。给她这几个属性,然后在和数据表字段映射。

    在各层之间起到了一个传输数据的桥梁作用,她在三层架构中是可有可无的,她事实上就是面向对象编程中最主要的东西--类。一个桌子是一个类,一条新闻也是一个类。int,string,double等也是类,所以,model不过一个类。这样,Model在三层架构中的位置,和int,string等变量的地位就一样了,没有其它的目的,仅用于数据的存储而已,只不过她存储的是复杂的数据。所以假设我们的项目中对象都很easy。那么就不用Model而直接传递多个參数也能做成三层架构,那么为什么要须要Model呢?她的优点是什么呢?Model在各层參数传递时究竟能起到什么作用?例如以下:在各层间传递參数时,能够是这样:                        AddUser(userID,userName,userPassword),

    也能够是样:AddUser(userInfo)

    这两种方法那个好?一目了然,肯定是另外一种要好非常多,那么什么时候用普通变量类型(int,string。double)在各层之间传递參数,什么时候用Model传递,例如以下:

     

    <span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">   SelectUser(int UserId)
        SelectUserByName(string username)
        SelectUserByName(string username,string password)
        SelectUserByEmail(string email)
        SelectUserByEmail(string email,string password)</span></span></span></span></span>
           能够概括为
           SelectUser(userId)
           SelectUser(user)
           这里用user这个Model对象囊括了username,password,email这三个參数的四种组合模式。

    UserId事实上也能够合并到user中。但项目中其他BLL都实现了带有id參数的接口,所以这里也保留这一项。   传入了userInfo,那怎样处理呢,这个就须要依照先后的顺序了,有详细代码决定。这里按这个顺序处理首先看是否同一时候具有username和password。然后看是否同一时候具有email和password。然后看是否有username。然后看是否有email。依次处理。这样。假设以后添加一个新内容,会员卡(number),则无需更改接口,仅仅要在DAL的代码中添加对number的支持即可。然后前台添加会员卡一项内容的表现与处理即可。

           理论知识了解了,还须要在项目中历练,接下来,以一个简单的登录为例,先看看我们的类图:

           

           依据我们上述的UML图。看一下,我们三层架构是怎样构建的:

            

           接下来U层,她的作用是向用户展现特定业务数据,採集用户的输入信息和操作,原则:用户至上,兼顾简洁,代码实现:

         

    <span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">Public Class Form1
        Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click
            Me.Close()
        End Sub
    
        Private Sub BtnOK_Click(sender As Object, e As EventArgs) Handles BtnOK.Click
            Try
                Dim eUser2 As New Model.Login                  '实例化新的UserInfo,用来传递B层的实体
                Dim eUser3 As Model.Login                      '定义一个类型为Userinfo的參数。用来赋值
                eUser2.UserName = txtUserName.Text.Trim        '将username传给实体层的UserName
                eUser2.Pwd = txtpassword.Text.Trim             '将密码传给实体层的UserName
    
                '调用B层,登录推断
                Dim mgr As New BLL.LoginManager
                eUser3 = mgr.UserLogin(eUser2)
    
            Catch ex As Exception
                MessageBox.Show(ex.Message.ToString())
            End Try
        End Sub
    End Class</span></span></span></span></span>
           接下来。B层。她的作用有三个首先从DAL获取数据,提供UI显示。其次UI获取用户和指令,运行业务逻辑;最后UI获取用户和指令,通过DAL写入数据,代码实现:

            

    <span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">Public Class LoginManager
        Public Function UserLogin(ByVal User As Model.Login) As Model.Login
            Dim uDao As New DAL.UserDAO                  '实例化D层中新的UserDAO对象
            Dim eUser1 As Model.Login                    '定义一个类型为实体层UserInfo的參数,用于赋值
            eUser1 = uDao.SelectUser(User)
    
            '推断是否查询到记录,若有。登录成功。并返回实体User1
            If IsNothing(eUser1.UserName) Then
                Throw New Exception("登录失败,请检查username和password!")
            Else
                MsgBox("登录成功。立即进入系统!")
                Return eUser1
            End If
        End Function
    End Class</span></span></span></span></span>

          数据訪问层。也就是D层,她的作用是从数据源载入数据;向数据源写入数据。从数据源删除数据,代码实现:

        

    <span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">Imports System.Data
    Imports System.Data.SqlClient
    Imports Model
    
    Public Class UserDAO
        Public conn As New SqlConnection("Server=(Local);Database=jin;User ID = sa;Password=123456") '创建数据库连接
        Public Function SelectUser(ByVal User As Login) As Model.Login '传实体UserInfo,而不是參数UserName,ID等。这样可方便对实体中的參数进行调用
            Dim reader As SqlDataReader            '定义类型为SqlDataReader的变量reader
            Dim eUser As New Model.Login           '实例化新的UserInfo
    
            Dim sql As String = "SELECT UserName,PWD From Login Where UserName =@UserName And PWD=@PWD"
            Dim cmd As New SqlCommand(sql, conn)    '创建sqlcommand对象
            cmd.CommandText = sql                   '获取sql语句的详细内容
            cmd.CommandType = CommandType.Text      '获取上述sql语句的详细类型
            cmd.Parameters.Add(New SqlParameter("@UserName", User.UserName))
            cmd.Parameters.Add(New SqlParameter("@PWD", User.Pwd))
    
            conn.Open() '打开数据库连接
            reader = cmd.ExecuteReader             '运行查询语句。并生成一个DataReader
    
            '读取查询到的数据,并返回给对应的属性
            While reader.Read
                '获取数据库中对应字段的数据
                '数组必须从零開始读取。否则会超出其界限
                eUser.UserName = reader.GetString(0)
                eUser.Pwd = reader.GetString(1)
            End While
            Return eUser '返回查询到的实体
            conn.Close() '关闭连接
        End Function
    
    End Class</span></span></span></span></span>
            最后,实体层:

            

    <span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">Public Class Login
        Private _username As String
        Public Property UserName As String
            Get
                Return _username
            End Get
            Set(value As String)
                _username = value
            End Set
        End Property
    
    
        Private _pwd As String
        Public Property Pwd As String
            Get
                Return _pwd
    
            End Get
            Set(value As String)
                _pwd = value
            End Set
        End Property
    End Class
    </span></span></span></span></span>
             至此。三层登录,net版本号的样例就实现了。执行效果例如以下:

                   

             在敲样例的过程中遇见了非常多错,比方无法启动带有“类库输出类型”的项目;程序不包括适合CSC于入口点的静态Main方法;未处理InvalidOperationExcetion;通过上网查资料,寻求帮助,一一解决。在这个过程中一点一点的积累。

    小小的登录窗体。开启大大的世界......

  • 相关阅读:
    关于故事和段子
    SQLserver2008数据库备份和还原问题(还原是必须有完整备份)
    百度文库破解方法
    如何识别病毒,转自百度文库,千辛万苦破解出来的
    20个人艰不拆的事实:知道真相的我眼泪掉下来 T.T
    linux学习网站分享
    个人对于腾讯和优酷的看法
    今天去客户现场的一些感想
    基于 Blazui 的 Blazor 后台管理模板 Blazui.Admin 正式尝鲜
    新手福利!Blazor 从入门到砖家系列教程(你真的可以成为砖家)
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/6874422.html
Copyright © 2011-2022 走看看