在不懈的努力下,终于把加上设计模式的登陆实例给拿下啦,下面就给大家讲讲抽象工厂加反射的登陆实例是怎么实现的!
首先先看下关于三层中的登陆小例子,把三层之间层与层之间的关系理清楚。点击打开链接
抽象工厂+反射的作用就是降低B层与D层之间的耦合度,利用反射可以解决在程序中想变更其他数据库但是不用重新更改代码的问题,同样也是降低了与数据库之间的耦合度。
接下来以具体的登陆实例介绍下抽象工厂+反射的设计模式在代码中到底是怎么运用的。
一、U层代码
用户登陆时最先接触到的是U层,U层负责接收用户所输入的信息传入B层!(在U层和B层之间也可以加上外观模式,在这里先不做介绍)
Imports Model
Imports system_BLL
Public Class frmLogin
''' <summary>
''' 用户登录界面,判断用户能否成功登陆
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Public Sub cmdLogin_Click(sender As Object, e As EventArgs) Handles cmdLogin.Click
'实例化实体类
Dim LUser As New Model.LoginEnity
'将用户界面输入的用户名和密码赋值给实体中
LUser.UserName = txtUserName.Text.Trim()
LUser.PassWord = txtPassword.Text.Trim()
'实例化B层,在这跳转到B层
Dim BCheck As New system_BLL.UserLoginBLL
'判断能否能够成功登陆
If BCheck.CheckUser(LUser) = True Then
MsgBox("登录成功!")
Else
MsgBox("登录失败!请检查用户名和密码是否正确!")
End If
End Sub
End Class
二、B层代码
B层代码和之前的三层登陆例子的代码很相似,唯一不同的是,B层接收到所传回来的值是从工厂中传来的,而不是D层!
Imports Model
Imports IDAL
Imports system_Factory
Public Class UserLoginBLL
''' <summary>
''' 判断用户是否能够成功登陆
''' </summary>
''' <param name="User"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function CheckUser(ByVal User As Model.LoginEnity) As Boolean
'实例化这个工厂
Dim factory As New Factory_Login
'定义BIUser为数据库查询中返回的值
Dim BIUser As New List(Of Model.LoginEnity)
'定义BIUser为工厂方法中的返回值
BIUser = Factory_Login.CreateUserInfo.check(User)
'判断是否存在这个用户名
If BIUser.Count = 0 Then
Return False
Else
Return True
End If
End Function
End Class
三、接口
脑补下什么是接口:接口——(百度百科)在这里我理解的接口相当于外部我想要一个判断用户名是否存在的功能,通过接口寻找内部具体实现的这个功能的方法!
Imports Model
Public Interface IUserInfo
''' <summary>
''' 定义一个连接数据库的接口,check方法是验证是否能够成功登陆
''' </summary>
''' <param name="userEnity"></param>
''' <returns></returns>
''' <remarks></remarks>
Function check(ByVal userEnity As Model.LoginEnity) As List(Of Model.LoginEnity)
End Interface
四、抽象工厂
抽象工厂就是封装了一个个不同的实现判断用户是否存在这个功能,具体的实现方法不一样,但是最终要达到的效果是一样的!(可能理解的不是很到位,大家多批评指点)
Imports IDAL
Imports System.Reflection
Imports System.Configuration
Public Class Factory_Login
''' <summary>
''' 用户登陆的工厂方法
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function CreateUserInfo() As IUserInfo
'定义AssemblyName作为D层的程序集名称
Static Dim AssemblyName As String
AssemblyName = "DAL"
'定义db为连接配置文件
Dim db As String
db = System.Configuration.ConfigurationManager.AppSettings("DBString")
'定义className为D层的根命名空间
Dim className = AssemblyName + "." + db + "CheckUser"
'定义iuser为接口,返回这个接口的方法
Dim iuser As IUserInfo
iuser = CType(Assembly.Load(AssemblyName).CreateInstance(className), IUserInfo)
Return iuser
End Function
End Class
在这AssemblyName,和ClassName具体的写法经常会遇到很多的问题,在这先不做介绍,请看系列文章
五、D层
这里放的就是具体的查询数据库的内容,这里使用到sqlhelper类,之前写到过,大家可以看下之前写到的博客点击打开链接
Imports IDAL
Imports System.Data.SqlClient
Imports System.Collections.Generic
Imports Model
''' <summary>
''' 查询数据库,判断用户是否能够成功登陆
''' </summary>
''' <remarks></remarks>
Public Class sqlCheckUser : Implements IDAL.IUserInfo
Private ReadOnly sqlHelper As New SQLHelper
Public Function Check(ByVal IUser As Model.LoginEnity) As List(Of Model.LoginEnity) Implements IDAL.IUserInfo.check
'定义D层查询的返回值类型为Datatable
Dim table As New DataTable
'查询数据库中的信息,判断用户名是否存在
Dim sql As String = "select * from T_UserInfo where UserName=@UserName "
Dim SqlParamete As SqlParameter() = {New SqlParameter("@UserName", IUser.UserName)}
'给table赋值
table = sqlHelper.ExecSelect(sql, CommandType.Text, SqlParamete)
'将查询出来的Datatable类型的数值转换成泛型集合的类型
Dim myList As List(Of Model.LoginEnity)
myList = ModelHelper.convertToList(Of Model.LoginEnity)(table)
Return myList
End Function
End Class
六、实体
Public Class LoginEnity
'定义UserName的属性
Private _UserName As String
Public Property UserName As String
Get
Return _UserName
End Get
Set(value As String)
_UserName = value
End Set
End Property
'定义Password的属性
Private _Password As String
Public Property PassWord As String
Get
Return _Password
End Get
Set(value As String)
_Password = value
End Set
End Property
Private level As String
Public Property UserLevel As String
Get
Return level
End Get
Set(value As String)
level = value
End Set
End Property
End Class
七、配置文件
书写配置文件时,需要注意一个很大的问题,就是区分大小写,key的值和value的值一定要区分大小写。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<appSettings>
<add key="ConnStr" value="Server=.; Database = cybercafe-sys;User=sa;Password=123456" />
<add key="DBString" value ="sql"></add>
</appSettings>
</configuration>
小结:
万事开头难,调了很多天的代码,才算是把登陆给弄出来了,算是松了一口气,理解了之后发现其实挺简单的,需要自己动手实践!在写代码的过程中遇到了很多的问题和错误,在之后的系列文章中会一一介绍所出现问题的解决方法,大家记得关注哦!