差不多一个月吧,总算是完成7层登陆了,从刚开始的根本传不到D层,再到使用反射+配置文件,再到SQLHelper,一步一步实现了。
类:可以说是对象的集合,在代码中要想使用对象,你就得有类,反映在代码中就是声明,就是实例化。
消息:我认为这是面向对象中最厉害的一个,也是最重要的一个,没有消息,那么对象和对象之间就没有了联系。消息就是对象与对象之间来通信的。而且消息和7层联系挺大的。
7层:是三层演化而来的,我是直接在三层的基础上扩展而来的,在U层和B层之间添加外观层,高大上一点就是外观模式,实现U层和B层的松耦合。B层和D层之间添加了接口层,工厂层,也就是我们学的抽象工厂模式。实现B层和D层的松耦合。在三层达到松耦合之后,那么7层也就实现了。
实现7层登录:7层登陆也是经过了好几天的摸打滚爬,算是完成了。7层是面向对象的,那么干脆我们设想7层就是7个对象,这7个对象要完成从U层出发,到数据库,在回到U层。要想完成这条线,还需要知道对象的关系和消息。根据前辈们的总结,我们可以很清楚的知道各个层有什么样的关系。看图:
之后就是面向对象的消息了,联系生活中,完成7层登陆就是击鼓传花中的传花,从U层传出,最后再从D层传回来。
而消息就是经过这7个人处理的花。
代码表现:在代码中,消息就是我们定义的各个参数,和返回类型。从U层发出消息,然后D层再返回一个消息。
这个消息可以是实体,也可以是泛型,也可以是DataTable,各种各样。总之无论使用哪个,都要知道怎么使。毕竟现在是学习。
修改后一定要生成解决方案,然后运行。
代码仅供参考,请抱怀疑态度,如有误导,算你倒霉。欢迎大家指正。
D层
//除了工厂返回接口外,其他层我都是返回实体。
Public Function selectUser(ByVal user As Medol.UserInfo) As Medol.UserInfo Implements [Interface].IUser.selectUser //D层的一个方法,返回一个实体,最后到U层,与输入的数据进行对比。
Dim euser As New Medol.UserInfo
Dim type As New CommandType
Dim str As String = " select * FROM User_Info WHERE UserName=@userName " //SQL语句,以前就听说过参数化查询避免SQL注入,现在总算是知道了。
Dim pras As SqlParameter() = {New SqlParameter("@userName", user.uName)} //加载参数。
Dim helper As New SQLHelper
Dim reader As SqlClient.SqlDataReader = helper.selectUser(str, type, pras) //调用SQLHelper的方法
While (reader.Read()) //只读属性,查不到记录时为空。
euser.uHead = reader.GetString(0).Trim
euser.uName = reader.GetString(1).Trim
euser.uWord = reader.GetString(2).Trim
euser.uHead = reader.GetString(3).Trim
End While
Return euser
End Function
SQLHlper 的方法
Public Function selectUser(ByVal str As String, type As CommandType, ByVal pras As SqlParameter()) As SqlDataReader
Dim conn As New SqlConnection
conn.ConnectionString = constr
Dim cmd As New SqlClient.SqlCommand
cmd.CommandText = str
cmd.Connection = conn
cmd.Parameters.AddRange(pras) //这里要注意了,是AddRange,还有Add.注意区别
conn.Open()
Dim reader As SqlClient.SqlDataReader = cmd.ExecuteReader() //另外还有CMD的释放资源,以及参数集的清空都要考虑。遇到错误在添加。
conn.close
Return reader
End Function
B层的方法
Public Function LoginUser(ByVal user As Medol.UserInfo) As Medol.UserInfo
Dim factoryUser As New Factory.DataFactory()
Dim IselectUser As IUser
IselectUser = factoryUser.SelectUser()
Dim Euser As Medol.UserInfo
Euser = IselectUser.selectUser(user)
Return Euser
End Function
<span style="font-size:32px;">外观层</span>
Public Function FacadeSelectUser(ByRef UserInfo As Medol.UserInfo) As Medol.UserInfo
Dim BllSelectUser As New BllUser
Dim euser As Medol.UserInfo
euser = BllSelectUser.LoginUser(UserInfo)
Return euser // 返回实体
End Function
U层
Try
Dim user As New UserInfo
user.uName = txtuserName.Text
user.uWord = txtpassWord.Text
Dim login As New Facade.Facade
Dim flg As Medol.UserInfo = login.FacadeSelectUser(user)
//根据D层的返回值,进行判断。 放U层呢,还是B层呢。
If flg.uName <> user.uName Then
MessageBox.Show("该用户不存在!" & flg.uName & "df" & user.uName)
Exit Sub
End If
If flg.uWord <> user.uWord Then
MessageBox.Show("密码错误")
End If
If flg.uWord = user.uWord And flg.uName = user.uName Then
Dim frm As New frmMain
frm.Show()
Me.Hide()
End If
Catch ex As Exception
Windows.Forms.MessageBox.Show(ex.Message.ToString()) //捕捉异常
End Try
接口
Public Interface IUser
Function selectUser(ByVal UserInfo As Medol.UserInfo) As Medol.UserInfo
End Interface
工厂层
Public Class DataFactory
Private DB As String = System.Configuration.ConfigurationSettings.AppSettings("DBstring") //配置文件
Private AssemblyName As String = "DAL"
Public Function SelectUser() As IUser
'Dim loginUser As IUser
Dim constr As String = AssemblyName & "." & DB & "User" //拼接
Dim iUser As IUser
iUser = CType(Assembly.Load(AssemblyName).CreateInstance(constr), IUser) //转换函数
Return iUser
End Function