层,百度百科这样解释,首先-重叠起来的东西;重叠起来的东西中的一部分:层次|表层|大气层。其次-重叠;重复:层峦叠嶂|层出不穷。最后-量词,用于可以分出层次的事物,女孩儿强烈的第六感,三层中的层一定是第三个意思,三层架构(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等变量的地位就一样了,没有其他的目的,仅用于数据的存储而已,只不过她存储的是复杂的数据,所以如果我们的项目中对象都非常简单,那么就不用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
            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("登录失败,请检查用户名和密码!")
        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;通过上网查资料,寻求帮助,一一解决,在这个过程中一点一点的积累。小小的登录窗口,开启大大的世界......

三层登录实例VB.NET版详解---理论加实战篇的更多相关文章

  1. 三层登录实例VB.NET版具体解释---理论加实战篇

    层,百度百科这样解释,首先-重叠起来的东西:重叠起来的东西中的一部分:层次|表层|大气层.其次-重叠.反复:层峦叠嶂|层出不穷.最后-量词,用于能够分出层次的事物.女孩儿强烈的第六感,三层中的层一定是 ...

  2. 三层架构实例 VB.NET版

    三层实例 首先发现感慨,对于三成这块,用到都是一些面向对象的特征,尤其是对象的实例化.如果你不是很注意的话,那么,你就会一头雾水,就像我一样,慢慢的雾里看花,最后也是走出来的,不过用的事件是相当的. ...

  3. 用Advanced Installer制作DotNetBar for Windows Forms 12.0.0.1_冰河之刃重打包版详解

    关于 DotNetBar for Windows Forms 12.0.0.1_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版-------------- ...

  4. PHP cURL应用实现模拟登录与采集使用方法详解

    对于做过数据采集的人来说,cURL一定不会陌生.虽然在PHP中有file_get_contents函数可以获取远程链接的数据,但是它的可控制性太差了,对于各种复杂情况的采集情景,file_get_co ...

  5. PHP cURL实现模拟登录与采集使用方法详解教程

    来源:http://www.zjmainstay.cn/php-curl 本文将通过案例,整合浏览器工具与PHP程序,教你如何让数据 唾手可得 . 对于做过数据采集的人来说,cURL一定不会陌生.虽然 ...

  6. 【three.js详解之一】入门篇

    [three.js详解之一]入门篇   开场白 webGL可以让我们在canvas上实现3D效果.而three.js是一款webGL框架,由于其易用性被广泛应用.如果你要学习webGL,抛弃那些复杂的 ...

  7. net core 中间件详解及项目实战

    net core 中间件详解及项目实战 前言 在上篇文章主要介绍了DotNetCore项目状况,本篇文章是我们在开发自己的项目中实际使用的,比较贴合实际应用,算是对中间件的一个深入使用了,不是简单的H ...

  8. hadoop之yarn详解(框架进阶篇)

    前面在hadoop之yarn详解(基础架构篇)这篇文章提到了yarn的重要组件有ResourceManager,NodeManager,ApplicationMaster等,以及yarn调度作业的运行 ...

  9. 3.awk数组详解及企业实战案例

    awk数组详解及企业实战案例 3.打印数组: [root@nfs-server test]# awk 'BEGIN{array[1]="zhurui";array[2]=" ...

随机推荐

  1. DotnetSpider (一) 架构的理解、应用、搭建

    第一次写博客,比较浅显,欢迎大牛们指点一二,不胜感激.   ** 温馨提示:如需转载本文,请注明内容出处.**   本文连接:http://www.cnblogs.com/grom/p/8931650 ...

  2. Codeforces Round #305 (Div. 2) B. Mike and Fun 暴力

     B. Mike and Fun Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/548/pro ...

  3. Minimize the error CodeForces - 960B

    You are given two arrays A and B, each of size n. The error, E, between these two arrays is defined  ...

  4. oo第二阶段总结

    第五次作业--多线程电梯 一.设计策略 本次作业是我们第一次接触多线程,给程序添加多线程功能后最大的挑战是实现共享数据的安全.避免冲突,由于这次作业是第一次尝试多线程方法,因此采用了将所有方法都加上s ...

  5. 机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾

    作者:寒小阳 && 龙心尘 时间:2015年11月. 出处: http://blog.csdn.net/han_xiaoyang/article/details/49797143 ht ...

  6. Android布局概述

    布局 布局定义用户界面的视觉结构,如Activity或应用小部件的 UI.您可以通过两种方式声明布局: 在 XML 中声明 UI 元素.Android 提供了对应于 View 类及其子类的简明 XML ...

  7. 最优化方法:范数和规则化regularization

    http://blog.csdn.net/pipisorry/article/details/52108040 范数规则化 机器学习中出现的非常频繁的问题有:过拟合与规则化.先简单的来理解下常用的L0 ...

  8. Git运用基础之如何删除Github上不想要的项目

    今天突然想删除,(强迫症想删除)之前练习时多创建的多个Github上的源代码或者无用Demo地址,然后看了一些文章都比较老式,这里我展示一下最新的删除步骤. 一.首先登录自己的Github账户主页(没 ...

  9. ACE在Linux下编译安装

    下载地址: http://download.dre.vanderbilt.edu/ ACE版本:ACE-6.2.2.tar.bz2 下载完成后解压路径为:/root/ACE/ACE_wrappers ...

  10. openfire环境搭建

    1.下载源代码:http://www.igniterealtime.org/downloads/source.jsp 2.把源代码解压出的openfire_src文件夹放至eclipse workpl ...