博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
三层架构实战篇 下
阅读量:6153 次
发布时间:2019-06-21

本文共 4613 字,大约阅读时间需要 15 分钟。

     上篇博客差点儿是手把手的教大家如何做一个三层结构的demo,可是实现和执行出这个样例不是我们的目的。我们的目标是学习,所以这一次我们要用VB.NET将demo实现。而且还要对demo进行一些完好。

         作为一个系统登录的demo,其核心业务就是用户输入信息,然后系统验证此用户是否有权限进入系统,并返回验证结果,仅此而已,那么有什么需求是会变化呢?细致一想,UI不会有什么大的变化,BLL层主要是处理业务逻辑的,对登录来讲也没什么变化,那么唯独DAL层了,DAL层是用来訪问数据库,而数据库不唯独SQL Server一种,假设换成Oracle或者DB2。还能实现登录系统吗?显然是不能的,怎样解决?

         这时候,是该考虑使用设计模式了,那么用什么模式呢?依据需求,当然是工厂方法模式了。可是单纯的工厂方法模式并不能解决多个数据库和多个表之间的切换问题,再想有什么办法,那就是抽象工厂模式了,它能够解决这样的涉及多个产品系列的问题,可是假设要添加功能,那么修改的地方太多……算了直接使用绝招吧——反射+抽象工厂+配置文件。

         首先我给出加了设计模式的包图

        

         然后我们就打开VS2012,新建一个VB.NET的Windows窗口应用程序,然后依照包图的结构,构建三层结构。并为每层加入须要的类和接口,完毕后例如以下图:

        

         然后我们就能够,依照一定的顺序去编写各个类的代码了,我偏好从下往上写,也就是从数据訪问层開始。当然要考虑继承关系,总得先有父类吧,还有就是高层类比方抽象类等就得先写,come on……

         插入代码

         实体层DataEntity的UserInfo类

        

Public Class UserInfo    Private _userID As Integer    Private _userName As String    Private _password As String    '各个属性值的定义    Public Property UserID() As Integer        Get            Return _userID        End Get        Set(value As Integer)            _userID = value        End Set    End Property    Public Property UserName() As String        Get            Return _userName        End Get        Set(value As String)            _userName = value        End Set    End Property    Public Property Password() As String        Get            Return _password        End Get        Set(value As String)            _password = value        End Set    End PropertyEnd Class

         接口层IDAL的IUserInfo类

        

Imports DataEntityPublic Interface IUserInfo    Function UserLogin(ByVal user As DataEntity.UserInfo) As DataEntity.UserInfoEnd Interface

         抽象工厂Factory的DataAccess类

Imports System.ReflectionImports System.ConfigurationImports IDALPublic Class DataAccess    Dim DBstr As String = System.Configuration.ConfigurationSettings.AppSettings("DB")    Public Function CreateUser() As IDAL.IUserInfo        Return CType(Assembly.Load("LoginDAL").CreateInstance("LoginDAL" & "." & DBstr), IUserInfo)    End FunctionEnd Class	

         表示层LoginUI的配置文件App.config

        


         数据訪问层LoginDAL的Sqlserver类

        

Imports System.Data.SqlClientImports DataEntityImports IDALPublic Class Sqlserver : Implements IUserInfo    Dim strConn As String = System.Configuration.ConfigurationSettings.AppSettings("Connstr")    Dim conn As SqlConnection = New SqlConnection(strConn)    Public Function UserLogin(user As UserInfo) As UserInfo Implements IUserInfo.UserLogin        Dim Sqlserver As String = "select * from Users where UserName =@username"        Dim cmd As SqlCommand = New SqlCommand(Sqlserver, conn)        cmd.Parameters.Add(New SqlParameter("@username", user.UserName))        Dim reader As SqlDataReader        Dim user1 As New UserInfo        Try            conn.Open()            reader = cmd.ExecuteReader            While reader.Read()                user1.UserName = reader.Item("UserName")                user1.Password = reader.Item("Password")            End While            Return user1        Catch ex As Exception            MsgBox(ex.Message.ToString())            Return user        Finally            conn.Close()        End Try    End FunctionEnd Class

         业务逻辑层LoginBLL的LoginManager类

Imports FactoryImports IDALImports DataEntityPublic Class LoginManager    Public Function IdentifyUser(ByVal user As DataEntity.UserInfo) As UserInfo        Dim Iuser As IDAL.IUserInfo        Dim dataAccess As New DataAccess        Dim duser As UserInfo        Iuser = dataAccess.CreateUser()        duser = Iuser.UserLogin(user)        Return duser    End FunctionEnd Class

         表示层LoginUI的client代码

        

Imports DataEntityImports LoginBLLPublic Class Form1    Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click        Try            Dim user1 As New UserInfo            Dim user2 As New UserInfo            Dim loginmanager As New LoginManager            user1.UserName = txtUserName.Text.Trim()            user1.Password = txtPassword.Text            user2 = loginmanager.IdentifyUser(user1)            If user2.UserName = user1.UserName And user2.Password = user1.Password Then                MsgBox("登陆成功!请稍后……")                Exit Sub            Else                MsgBox("该用户信息不存在,请又一次输入!")                Exit Sub            End If        Catch ex As Exception            MessageBox.Show(ex.Message.ToString())        End Try           End Sub    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click        Me.Close()    End SubEnd Class

         总结:通过对这么一个小的样例加设计模式和反射机制以及配置文件等等。主要是为了学习和实践,一開始我也觉得根本没有必要。甚至觉得是过度设计。可是当自己參考设计模式的书准备将这个样例进行改进和扩展的时候。才发现自己根本不知道怎样下手,只是经过查阅博客和贵人相助,终究是调试执行起来了,同一时候也对三层的理解加深了一些。

本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5222471.html,如需转载请自行联系原作者

你可能感兴趣的文章
jquery源码03 (3184 , 3295) support : 功能检测
查看>>
python 穷举法 算24点(史上最简短代码)
查看>>
mysql left join 左连接查询关联n多张表
查看>>
Ext4.0 经常使用代码整理(一)
查看>>
希腊神话中的人物名称大全
查看>>
利用艺术家的整数ID映射将标签转换为向量
查看>>
asp.net mvc自动压缩文件,并生成CDN引用
查看>>
[php learn] php 从头開始学习1
查看>>
使用Docker部署Gitlab
查看>>
JAVA是否可以作脚本语言呢
查看>>
sibling
查看>>
程序员Git代码托管平台
查看>>
SpringMVC实战(注解)
查看>>
关于静态属性和静态函数
查看>>
进程的基本属性:进程ID、父进程ID、进程组ID、会话和控制终端
查看>>
RTSP客户端接收存储数据(live555库中的testRTSPClient实例)
查看>>
spring+jotm+ibatis+mysql实现JTA分布式事务
查看>>
hdu 4223 Dynamic Programming? (dp)
查看>>
谈谈我对Android View事件分发的理解
查看>>
linux下udev简介【转】
查看>>