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

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

   花费好几天的时间,终于从C#转化成了vb.net版本。期间参考了一些师哥师姐的博客来理解三层是如何交互的。

起初上一篇实例,并不是很懂,只是理解了个大概。然后根据那么多材料来进行对比。终于看懂他们是怎么进行操作的。就说看了那么多不同样式的实例之后,才知道谁的设计方案更好。知识是不变的,但是设计理念就能看出代码执行效率的高低。

 

   在使用三层的过程中,才能真正体会到,什么叫高内聚,低耦合。在程序发现错误之后,能把错误的细节定位到具体一层,甚至具体一类。仅仅修改或更换这一类就能调试出来。使得调试代码的量变的极底。这就是使用三层的好处吧。

   以下是本实例的设计,这个实例是模仿上篇实例得到的。所以名称有些不规范,请见谅。

 

数据库还是使用的上次的数据可,没有变动。

 

通过对实例的不断分解,单一职责划分。得到下图的引用关系。

 

接下来看一下各个层次的代码:

 

UI层:

 

  1. Public Class Form1  
  2.   
  3.     Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click  
  4.         Try  
  5.             Dim user1 As New Login.Moudel.UserInfoEntity  
  6.             Dim user2 As New Login.Moudel.UserInfoEntity    '使用user2来进行登陆  
  7.   
  8.             user2.USERNAME = txtUserName.Text.Trim  
  9.             user2.PASSWORD = txtPassword.Text  
  10.   
  11.             Dim mgr As New Login.BLL.LoginManager  
  12.             user1 = mgr.SelectUserLogin(user2)      '将登陆返回的结果存放到user1中  
  13.   
  14.             MessageBox.Show("登陆用户:" + user1.USERNAME)       '通知用户登陆成功  
  15.         Catch ex As Exception  
  16.             MessageBox.Show(ex.Message.ToString())      '登陆失败,通知用户  
  17.         End Try  
  18.   
  19.     End Sub  
  20.   
  21.     '退出系统  
  22.     Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click  
  23.         End  
  24.     End Sub  
  25. End Class  


B层:

  1. Public Class LoginManager  
  2.     Function SelectUserLogin(ByVal User As Login.Moudel.UserInfoEntity) As Login.Moudel.UserInfoEntity  
  3.         Dim bUser As LoginIDAL.IUser  
  4.         bUser = Factory.DataAccess.CreateUser()  
  5.   
  6.         Dim rUser As New Login.Moudel.UserInfoEntity     '定义一个数据实体  
  7.   
  8.         rUser = bUser.SelectUser(User)       '根据参数 查找数据库  并返回一个实体  
  9.   
  10.   
  11.         If IsNothing(rUser.USERNAME) Then       '判断用户名是否存在  
  12.             Throw New Exception("用户名 不存在")  
  13.         End If  
  14.   
  15.         If rUser.PASSWORD = User.PASSWORD Then  '判断密码是否正确  
  16.             Return rUser  
  17.         Else  
  18.             Throw New Exception("登陆失败,请检查用户名密码")  
  19.         End If  
  20.     End Function  
  21. End Class  

D层:

  1. Public Class DbConnStr  
  2.     Public Shared Function Connstring() As String  
  3.         Connstring = "Server=zc-pc;Database=UBDLogin;User ID=sa; Password=123456"  
  4.     End Function  
  5. End Class  

 

  1. Imports System.Data.SqlClient  
  2. Imports System.Data  
  3.   
  4. Public Class SqlServerDAO : Implements LoginIDAL.IUser  
  5.     Function SelectUser(ByVal user As Login.Moudel.UserInfoEntity) As Login.Moudel.UserInfoEntity Implements LoginIDAL.IUser.SelectUser  
  6.         Dim conn As New SqlConnection           '创建链接对象  
  7.          Dim cmd As New SqlCommand               '创建命令对象  
  8.         conn = New SqlConnection(DbConnStr.Connstring())    '链接数据库  
  9.         cmd.Connection = conn  
  10.   
  11.         cmd.CommandText = "Select * from Users Where UserName=@UserName" ' and Password=@Password"  
  12.         cmd.Parameters.Add(New SqlParameter("@UserName", user.USERNAME))  
  13.         'cmd.Parameters.Add(New SqlParameter("@Password", user.PASSWORD))  
  14.         cmd.CommandType = CommandType.Text  
  15.         conn.Open()  
  16.   
  17.         Dim reader As SqlDataReader = cmd.ExecuteReader        '执行生成一个dataReader  
  18.         Dim rUser As New Login.Moudel.UserInfoEntity            '用于保存返回实体  
  19.   
  20.         While (reader.Read())  
  21.             rUser.USERNAME = reader.GetString(1)  
  22.             rUser.PASSWORD = reader.GetString(2)  
  23.             rUser.LEVEL = reader.GetString(3)  
  24.             rUser.EMAIL = reader.GetString(4)  
  25.         End While  
  26.   
  27.         Return rUser    '返回取出得到的实体  
  28.         conn.Close()  
  29.   
  30.     End Function  
  31. End Class  

IDAL:


 

  1. Public Interface IFactory          '工厂类  
  2.     Function CreateUser() As LoginIDAL.IUser  
  3. End Interface  
  1. Public Interface IUser  
  2.     Function SelectUser(ByVal user As Login.Moudel.UserInfoEntity) As Login.Moudel.UserInfoEntity  
  3. End Interface  


Entity:

  1. Public Class UserInfoEntity  
  2.     Private _userID As String  
  3.     Private _userName As String  
  4.     Private _password As String  
  5.   
  6.     Public Property USERNAME() As String     '属性用户名  
  7.         Get  
  8.             Return _userName  
  9.         End Get  
  10.         Set(value As String)  
  11.             _userName = value  
  12.         End Set  
  13.     End Property  
  14.   
  15.     Public Property PASSWORD() As String   '属性用户名密码  
  16.         Get  
  17.             Return _password  
  18.         End Get  
  19.         Set(value As String)  
  20.             _password = value  
  21.         End Set  
  22.     End Property  
  23.   
  24.   
  25. End Class  

总结:三层架构,只是一种设计理念。帮助我们来优化代码,降低代码之间的耦合。仅仅通过几天的学习,是不可能全部掌握的。这种东西,就好比学习 面向对象的 思想, 需要在长期的实践 应用中,才能体会到里面的精髓。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值