每当别人问我关于三层的知识的时候我总是推荐自己的《三层架构之抽象工厂加反射》这篇博客。这篇博客是自己当时学习三层的时候写的一个简单的登录例子。这个例子通过登录这个用例简单的介绍了三层,然后过度的三层+简单工厂再过渡到三层+抽象工厂。不管说从方法命名或者代码风格上来说自己都不敢说是最好的,但是体现三层我感觉还是绰绰有余的。然而最近在给别人讲述三层时候被他人指出这篇博客的代码有些许错误,虽然别人指出的方式有些令自己不快,甚至气愤!但是毕竟还有人关注自己,还有人看自己的博客,还有人给自己指出不足,从这个方面来看这还应该算是好事。有错误就改!有错误才能进步嘛。也许这就是米老师总是说的教学相长吧,这次终于体会到了,而且体会很深刻!!!

教学相长

虽有嘉肴,弗食不知其旨也;虽有至道,弗学不知其善也。是故学然后知不足,教然后知困。知不足,然后能自反也;知困,然后自强也。故曰:教学相长也。

----摘自《礼记•学记》

真的是“知不足”了,真的是想“自强”了,为了验证代码的正确性决定将这个登录的小例子又从最简单的三层开始做起逐步增加难度(降低耦合度),重新实现了一遍。再一次用了用VB.NET,再次回到了傻瓜式的VS环境中。

代码如下:

简单三层

界面层

Public Class Login Private Sub btnLogin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLogin.Click Dim LUser As New Entity.User Dim BCheck As New Bll.BllLogin LUser.User_Id = txtUserId.Text LUser.User_Pwd = txtPwd.Text If BCheck.Check(LUser) = True Then MsgBox("登录成功!") Else MsgBox("登录失败!") End If End Sub Private Sub btnCancle_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancle.Click End End Sub End Class

BLL层

Public Class BllLogin Function Check(ByVal User As Entity.User) As Boolean Dim DaUser As New DAL.DalUserInfo Dim BlUser As New Entity.User BlUser.User_Id = User.User_Id BlUser = DaUser.Check(BlUser) If BlUser.User_Pwd = User.User_Pwd Then Return True Else Return False End If End Function End Class

DAL层

Imports System.Data.SqlClient Public Class DalUserInfo Dim ConnStr As String = "Data Source=192.168.24.186;Initial Catalog=Student;User ID=sa;Pwd=123456" Dim conn As SqlConnection = New SqlConnection(ConnStr) Function Check(ByVal User As Entity.User) As Entity.User Dim sql As String = "select * from UserInfo where User_ID='" & User.User_Id + "'" Dim cmd As SqlCommand = New SqlCommand(sql, conn) Dim read As SqlDataReader Try conn.Open() read = cmd.ExecuteReader read.Read() User.User_Id = read.Item("User_ID") User.User_Pwd = read.Item("User_Pwd") Return User Catch ex As Exception User.User_Pwd = "" Return User End Try End Function End Class

实体层

Public Class User Private userId As String Private userPwd As String Public Property User_Id() As String Get Return userId End Get Set(ByVal value As String) userId = value End Set End Property Public Property User_Pwd() As String Get Return userPwd End Get Set(ByVal value As String) userPwd = value End Set End Property End Class

三层+简单工厂

界面层代码不变

Bll层

Public Class BllLogin Function Check(ByVal User As Entity.User) As Boolean Dim DalFactory As New DAL.DFactory Dim BlUser As New Entity.User BlUser.User_Id = User.User_Id BlUser = DalFactory.CreateUserInfo.Check(BlUser) If BlUser.User_Pwd = User.User_Pwd Then Return True Else Return False End If End Function End Class

工厂

Imports [Interface] Public Class DFactory 'Dim DataBase As String = "Access" Dim DataBase As String = "Sql" Function CreateUserInfo() As IUserInfo Dim DB As IUserInfo Select Case DataBase Case "Sql" DB = New DalUserInfo 'Case "Access" ' DB = New D_UserInfoAccess End Select Return DB End Function End Class

接口

Public Interface IUserInfo Function Check(ByVal IUser As Entity.User) As Entity.User End Interface

DAL层

Imports System.Data.SqlClient Public Class DalUserInfo : Implements [Interface].IUserInfo Dim ConnStr As String = "Data Source=192.168.24.186;Initial Catalog=Student;User ID=sa;Pwd=123456" Dim conn As SqlConnection = New SqlConnection(ConnStr) Public Function Check(ByVal IUser As Entity.User) As Entity.User Implements [Interface].IUserInfo.Check Dim sql As String = "select * from UserInfo where User_ID='" & IUser.User_Id + "'" Dim cmd As SqlCommand = New SqlCommand(sql, conn) Dim read As SqlDataReader Try conn.Open() read = cmd.ExecuteReader read.Read() IUser.User_Id = read.Item("User_ID") IUser.User_Pwd = read.Item("User_Pwd") Return IUser Catch ex As Exception IUser.User_Pwd = "" Return IUser End Try End Function End Class

三层+抽象工厂

界面层代码不变

Bll层代码不变

接口代码不变

工厂代码

Imports [Interface] Imports System.Reflection Public Class DFactory 'Dim DataBase As String = "Access" 'Dim DataBase As String = "Sql" Dim strDB As String = System.Configuration.ConfigurationSettings.AppSettings("DBString") Function CreateUserInfo() As IUserInfo Return CType(Assembly.Load("DAL").CreateInstance("DAL.DalUserInfo" & strDB), IUserInfo) End Function End Class

DAL层

Imports System.Data.SqlClient Public Class DalUserInfoSql : Implements [Interface].IUserInfo 'Dim ConnStr As String = "Data Source=192.168.24.186;Initial Catalog=Student;User ID=sa;Pwd=123456" Dim strConnStr As String = System.Configuration.ConfigurationSettings.AppSettings("ConnStr") Dim conn As SqlConnection = New SqlConnection(strConnStr) Public Function Check(ByVal IUser As Entity.User) As Entity.User Implements [Interface].IUserInfo.Check Dim sql As String = "select * from UserInfo where User_ID='" & IUser.User_Id + "'" Dim cmd As SqlCommand = New SqlCommand(sql, conn) Dim read As SqlDataReader Try conn.Open() read = cmd.ExecuteReader read.Read() IUser.User_Id = read.Item("User_ID") IUser.User_Pwd = read.Item("User_Pwd") Return IUser Catch ex As Exception IUser.User_Pwd = "" Return IUser End Try End Function End Class

配置文件

<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client" /> </startup> <appSettings> <add key="ConnStr" value ="Data Source=192.168.24.186;Initial Catalog=Student;User ID=sa;Pwd=123456"></add> <add key="DBString" value ="Sql"></add> </appSettings> </configuration>

对于知识的认知真的是每次都有不同的感受,以前的目标只是实现,无论怎么样只要实现就好,有很多地方都是不理解的,现在再去看那些代码感觉理解起来轻松了很多。敲代码的过程中感触最大的就是java和net平台的区别。通过这段时间做DRP的经历明显感觉net简直是傻瓜化的操作,而java操作起来就要烦人的多,也许现在还是对java的IDE不太熟悉吧。

转载于:https://www.cnblogs.com/beijiguangyong/archive/2012/01/14/2330813.html

《三层架构之抽象工厂加反射》纠错相关推荐

  1. 三层架构之抽象工厂加反射mdash;mdash;实现数据库转换

    在做系统的时候有意识的用到了抽象工厂这个设计模式,主要解决的是数据库更换的问题. 下面就以简单的登录来逐步的分析一下这个模式. 经典的三层架构 数据库如下 1.      一般的数据库连接方式 界面层 ...

  2. 剪不断,理不乱——三层架构之抽象工厂加反射

    三层架构前面已经介绍过了,浅谈三层架构.本篇文章主要介绍三层架构中加入抽象工厂和反射加配置文件.以机房收费系统的登录为例. 首先对机房收费系统进行分层,分为三层表示层,业务逻辑层,数据访问层.为了降低 ...

  3. 三层之抽象工厂加反射实例

    C#版的三层登陆实例,只是为了学习三层而实现的.为了接下来需要进行的vb.net版机房收费系统.根据上次的C#改编的vb.net版本登陆实例.不过在验收的时候发现了很多问题,所以进行了修改. 花费好几 ...

  4. 机房重构 之 抽象工厂+反射+配置文件 实现数据库訪问

    重构机房已经開始三个多星期了,从刚開始的一头雾水,到如今的柳暗花明,由開始的无从下手,到如今感觉犹 如脱胎换骨了般.和两个星期前相比.如今明朗了多了,心情也好了不少. 先给大家看一下这次重构的总体架构 ...

  5. 简单工厂、工厂方法、抽象工厂、抽象工厂加简单工厂

    简单工厂模式:简单工模式时类的创建模式,又叫做静态工厂方法(static Factory Method).简单工厂模式是一个工厂对象决定创建出哪一种产品类的实例.它存在的目的很简单:定义一个创建对象的 ...

  6. 简单工厂模式,抽象工厂模式,反射工厂模式的代码总结

    工厂模式也用了不少,特别是MS的petshop中对数据库的访问,通过工厂模式可以达到自由切换SQL 和 Oracle 数据库.近来也在看设计模式的书,发现工厂模式还是有不少的扩展.结合书中的知识和我自 ...

  7. C# 三层级架构问题之 能加载文件或程序集或它的某一个依赖项。系统找不到指定的文件

    用抽象工厂加反射来确定调用哪一个D层的时候,出现了错误"未能加载文件或程序集或它的某一个依赖项.系统找不到指定的文件" 如下图所示: 出现这种错误有两种情况: 1.      DL ...

  8. MVC三层+会话层+线程安全+抽象工厂+DataBase First的基础框架

    1.建立数据库OA,表UserInfo 2.创建类库项目以及mvc4 web项目 1)OA.Model 层:模型 2)OA.IDal 层 :数据接口 3)OA.Dal层 :数据实现 4)OA.IDBS ...

  9. 从DRP架构进行简单工厂代替抽象工厂的SWOT分析

    一.前情回顾 1.简单工厂 VS 工厂方法VS抽象工厂: [简单工厂 VS 工厂方法VS抽象工厂](http://blog.csdn.net/wangyy130/article/details/248 ...

最新文章

  1. 怎么确定迭代器后面还有至少两个值_JS Lazy evaluation:可迭代对象与迭代器
  2. java makerdd_Spark中parallelize函数和makeRDD函数的区别
  3. idea新建maven项目没有src目录
  4. binary masks_Python中的Masks概念
  5. 云上虚拟IDC(私有池)如何为客户业务的确定性、连续性保驾护航
  6. [转载] python学习笔记2--操作符,数据类型和内置功能
  7. 自动化环境部署工具的编写
  8. r语言回归分析_R语言之cox回归分析
  9. 关于JavaScript中变量的相互引用
  10. 【Android开发】图形图像处理技术-绘制文本
  11. 响应式十日谈第一日:使用 rem 设置文字大小
  12. 企业信息化政务信息化浙里办
  13. php date转换为时间戳,php date如何转换时间戳
  14. 基于SpringBoot超市库存管理系统+文档
  15. java:begin_end,C++ STL begin()和end()函数用法
  16. win10u盘被写保护怎么解除_win10系统下u盘被写保护怎么解除_win10解除u盘写保护方法...
  17. “内容为王”时代,游戏渠道商还能“躺赢”吗?
  18. 【字符串匹配】BF算法
  19. 基于微信小程序付费自习室系统(微信小程序毕业设计)
  20. 4500m a8 amd_amd a8 4500m等同什么intel

热门文章

  1. JS:ES6-4 简化对象与箭头函数
  2. 旅游景点、住宿带餐饮一天一万多流水能做到吗?
  3. 亲情可以冷酷到什么地步?大家有亲身经历的吗?
  4. 我做自媒体每日的工作时间安排
  5. 揭开发家致富的2个途径
  6. 如何判断一个大佬值不值得跟随
  7. 经常用everything对硬盘有伤害吗?
  8. 抖音为什么能让人上瘾?
  9. Android数据存储——内部存储
  10. [leetcode]84. Largest Rectangle in Histogram c语言