三层登录实例VB.NET版详解---理论加实战篇
2014-06-02 20:43
411 查看
层,百度百科这样解释,首先-重叠起来的东西;重叠起来的东西中的一部分:层次|表层|大气层。其次-重叠;重复:层峦叠嶂|层出不穷。最后-量词,用于可以分出层次的事物,女孩儿强烈的第六感,三层中的层一定是第三个意思,三层架构(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传递,如下:
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层,她的作用是向用户展现特定业务数据,采集用户的输入信息和操作,原则:用户至上,兼顾简洁,代码实现:
数据访问层,也就是D层,她的作用是从数据源加载数据;向数据源写入数据;从数据源删除数据,代码实现:
在敲例子的过程中遇见了很多错,比如无法启动带有“类库输出类型”的项目;程序不包含适合CSC于入口点的静态Main方法;未处理InvalidOperationExcetion;通过上网查资料,寻求帮助,一一解决,在这个过程中一点一点的积累。小小的登录窗口,开启大大的世界......
接下来,以登录为例,结合分层,总结一下在这个小例子中的所思所想。首先,来看一下,数据在三层中的一个具体走向,各层之间关系如下所示:
首先,我们需要知道各个层之间的引用关系,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版详解---理论加实战篇
- 三层登录实例VB.NET版具体解释---理论加实战篇
- 三层架构实战篇—系统登录实例
- 三层架构实战篇—系统登录实例
- 三层架构实战篇—系统登录实例
- 实例详解Spring Boot实战之Redis缓存登录验证码
- 三层架构实战篇—系统登录实例【好】
- 三层架构实战篇—系统登录实例
- 三层架构实战篇—系统登录实例
- VB.NET版三层登录实例
- TCP三次握手四次挥手理论加实例详解
- ssh证书登录(实例详解)
- 传参数与传实体、返回实体与返表——三层架构登录实例
- Json和Jsonp理论实例代码详解
- Json和Jsonp理论实例代码详解
- VB.NET三层登录实例(抽象工厂+反射+配置文件)
- VB.Net 三层登录实例
- oracle实例恢复 详解理论知识
- 三层搭建到实现的登录实例
- SSH证书登录(实例详解)