三层架构之抽象工厂加反射mdash;mdash;实现数据库转换
在做系统的时候有意识的用到了抽象工厂这个设计模式,主要解决的是数据库更换的问题。
下面就以简单的登录来逐步的分析一下这个模式。
经典的三层架构
数据库如下
1. 一般的数据库连接方式
界面层
1: Public Class Login
2: Private Sub btnLogin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLogin.Click
3: Dim LUser As New Entity.User
4: Dim BCheck As New BLL.B_Login
5: LUser.User_ID = txtName.Text
6: LUser.User_Pwd = txtPwd.Text
7: If BCheck.Check(LUser) = True Then
8: MsgBox("登录成功!")
9: Else
10: MsgBox(“"登录失败!")
11: End If
12: End Sub
13:
14: Private Sub btnCancle_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancle.Click
15: End
16: End Sub
17: End Class
业务逻辑层
1: Public Class B_Login
2: Function Check(ByVal User As Entity.User) As Boolean
3: Dim DaUser As New DAL.D_UserInfo
4: Dim BlUser As New Entity.User
5: Bluser.User_ID=User.ID
6: BlUser = DaUser.Check(BlUser)
7: If BlUser.User_Pwd = User.User_Pwd Then
8: Return True
9: Else
10: Return False
11: End If
12: End Function
13: End Class
数据持久层
1: Imports System.Data.SqlClient
2: Public Class D_UserInfo
3: Dim ConnStr As String = "Data Source=******;Initial Catalog=Student;User ID=sa;Password=******"
4: Dim conn As SqlConnection = New SqlConnection(ConnStr)
5: Function Check(ByVal User As Entity.User) As Entity.User
6: Dim sql As String = "select * from UserInfo where UserInfo=" & User.User_ID
7: Dim cmd As SqlCommand = New SqlCommand(sql, conn)
8: Dim read As SqlDataReader
9: Try
10: conn.Open()
11: read = cmd.ExecuteReader
12: User.User_ID = read.Item(0)
13: User.User_Pwd = read.Item(1)
14: Return User
15: Catch ex As Exception
16: User.User_Pwd = ""
17: Return User
18: End Try
19: End Function
20: End Class
2. 简单工厂
添加一个工厂类和一个接口
接口类
1: Public Interface IUserInfo
2: Function Check(ByVal IUser As Entity.User) As Entity.User
3: End Interface
工厂类
1: Imports [Interface]
2: Public Class DFactory
3: 'Dim DataBase As String = "Access"
4: Dim DataBase As String = "Sql"
5: Function CreateUserInfo() As IUserInfo
6: Dim DB As IUserInfo
7: Select Case DataBase
8: Case "Sql"
9: DB = New D_UserInfoSql
10: 'Case "Access"
11: ' DB = New D_UserInfoAccess
12: End Select
13: Return DB
14: End Function
15: End Class
当然D_UserInfoSql实现接口,代码基本不变
当有新的数据库使用时候(例如Access数据库)可以将工厂中的注释部分添上,然后重新写Dal层就可以直接使用,但是这样的不足是还是需要再次编译工厂,利用反射可以解决这个问题。
3.抽象工厂加反射
工厂类
1: Imports [Interface]
2: Imports System.Reflection
3: Public Class DFactory
4: '抽象工厂加反射
5: Dim DBString As String = System.Configuration.ConfigurationSettings.AppSettings("DBString")
6: Function CreateUserInfo() As IUserInfo
7: Return CType(Assembly.Load("DAL").CreateInstance("DAL.D_UserInfo" & DBString), IUserInfo)
8: End Function
9: End Class
数据持久层
1: Imports System.Data.SqlClient
2: Public Class D_UserInfoSql : Implements [Interface].IUserInfo
3: 'Dim ConnStr As String = "Data Source=******;Initial Catalog=Student;User ID=sa;Password=******"
4: Dim ConnStr As String = System.Configuration.ConfigurationSettings.AppSettings("ConnStr")
5: Dim conn As SqlConnection = New SqlConnection(ConnStr)
6: Public Function Check(ByVal IUser As Entity.User) As Entity.User Implements [Interface].IUserInfo.Check
7: Dim sql As String = "select * from UserInfo where UserInfo=" & IUser.User_ID
8: Dim cmd As SqlCommand = New SqlCommand(sql, conn)
9: Dim read As SqlDataReader
10: Try
11: conn.Open()
12: read = cmd.ExecuteReader
13: IUser.User_ID = read.Item(0)
14: IUser.User_Pwd = read.Item(1)
15: Return IUser
16: Catch ex As Exception
17: IUser.User_Pwd = ""
18: Return IUser
19: End Try
20: End Function
21: End Class
配置文件
1: <appSettings>
2: <add key="ConnStr" value ="Data Source=******;Initial Catalog=Student;User ID=sa;Password=******"></add>
3: <add key="DBString" value ="Sql"></add>
4: </appSettings>
添加两个Key,一个是连接数据库的字符串,一个是通过反射来产生不同数据库的Dal层的
这样一来就可以实现设计模式中的“开闭原则”,如果更换数据库只需要增加类(DAL),而不需要更改,更不需要重新编译。
PS:配置文件必须在界面层
1、 反射的写法:
objType=Assembly.Load(AssemblyPath).CreateInstance(className);其中:AssemblyPath指程序集名。className指命名空间.类名称。
2、 反射的一个原则:一切皆以UI层的bin文件夹中的dll名称为中心。(原因很简单:.net类加载的机制就是默认从本程序集的bin文件中找,所以bin文件夹中一定要有要加载的程序集的dll)。UI层中bin文件夹中dll叫什么名字AssemblyPath就使用什么名字,bin内部类的全名叫什么,className就写成什么全名。.net中的引用:加入对某个程序集的引用就能在程序集有变化时自动拷贝dll。
转载于:https://www.cnblogs.com/beijiguangyong/archive/2011/03/25/2302780.html
三层架构之抽象工厂加反射mdash;mdash;实现数据库转换相关推荐
- 《三层架构之抽象工厂加反射》纠错
每当别人问我关于三层的知识的时候我总是推荐自己的<三层架构之抽象工厂加反射>这篇博客.这篇博客是自己当时学习三层的时候写的一个简单的登录例子.这个例子通过登录这个用例简单的介绍了三层,然后 ...
- 剪不断,理不乱——三层架构之抽象工厂加反射
三层架构前面已经介绍过了,浅谈三层架构.本篇文章主要介绍三层架构中加入抽象工厂和反射加配置文件.以机房收费系统的登录为例. 首先对机房收费系统进行分层,分为三层表示层,业务逻辑层,数据访问层.为了降低 ...
- 三层之抽象工厂加反射实例
C#版的三层登陆实例,只是为了学习三层而实现的.为了接下来需要进行的vb.net版机房收费系统.根据上次的C#改编的vb.net版本登陆实例.不过在验收的时候发现了很多问题,所以进行了修改. 花费好几 ...
- 机房重构 之 抽象工厂+反射+配置文件 实现数据库訪问
重构机房已经開始三个多星期了,从刚開始的一头雾水,到如今的柳暗花明,由開始的无从下手,到如今感觉犹 如脱胎换骨了般.和两个星期前相比.如今明朗了多了,心情也好了不少. 先给大家看一下这次重构的总体架构 ...
- 简单工厂、工厂方法、抽象工厂、抽象工厂加简单工厂
简单工厂模式:简单工模式时类的创建模式,又叫做静态工厂方法(static Factory Method).简单工厂模式是一个工厂对象决定创建出哪一种产品类的实例.它存在的目的很简单:定义一个创建对象的 ...
- 简单工厂模式,抽象工厂模式,反射工厂模式的代码总结
工厂模式也用了不少,特别是MS的petshop中对数据库的访问,通过工厂模式可以达到自由切换SQL 和 Oracle 数据库.近来也在看设计模式的书,发现工厂模式还是有不少的扩展.结合书中的知识和我自 ...
- 工厂模式 + 反射 ?= 灵活多变的数据库
工厂模式 + 反射 ?= 灵活多变的数据库么 由于现实项目中我们难保会客户会更换系统的数据库,这样我们需要把若干数据库各种情况基本上都想到.多种数据库,引出抽象,我们就能在众多数据库的上层抽出一个Fa ...
- 课程设计-三层架构ASP.NET作品分享网站(sql server数据库)
1.主要功能: 前台:首页展现首页推荐的作品和精彩活动,图集页面可以进行搜索,作品以瀑布流的显示展现,有返回顶部的功能.登录以后可以报名活动发表自己的作品,还可以评论作品. 后台:管理作品,管理活动, ...
- C# 三层级架构问题之 能加载文件或程序集或它的某一个依赖项。系统找不到指定的文件
用抽象工厂加反射来确定调用哪一个D层的时候,出现了错误"未能加载文件或程序集或它的某一个依赖项.系统找不到指定的文件" 如下图所示: 出现这种错误有两种情况: 1. DL ...
最新文章
- Mac JDK和SDK环境变量配置
- vim改变与选择字休大小的方法
- Spark性能相关参数配置详解
- ICPC网络赛第二场G Limit
- 一篇文章带你弄懂大数据!
- 【BZOJ2221】面试的考验,随机数列+线段树+离线
- php gdb strace抓包,gdb,strace那些不常用的功能
- JS中的THIS处理及正则表达式 — 1、callapplyjson
- 请慎用ASP.Net的validateRequest=false属性
- Redis中的Scan命令的使用
- html泰勒展开,常见的泰勒公式展开式大全
- keras实现回归预测
- python3 selenium模块Chrome设置代理ip的实现
- Ubuntu 18.04 从零开始安装显卡驱动、配置MMDetection3D环境
- 网心科技打造全球首个百万量级节点的边缘云计算网络“星域云”
- 关于RegisterClass的注册位置
- MIPS指令集 指令的格式
- 集电极开路,漏极开路
- c8051f120相关
- 《kafka中文手册》- 构架设计(二)
热门文章
- ftp 200 227 451linux,FTP无法链接
- oracle xtts 测试,XTTS 跨平台表空间迁移测试
- mysql inno_mysql inno优化配置方法
- 电缆沟巡查机器人_电缆沟道巡检机器人的制作方法
- 错误: 找不到符号_Excel函数常见特殊符号、字符解读
- python安装后使用_Python安装后如何使用?
- rollback 最后判断成功_最后4天!这些你知道吗?
- 一起来看React(路由跳转)
- 部署ftp文件共享服务
- 《微信生活白皮书》发布微信用户数据