机房重构——7层登录

       差不多一个月吧,总算是完成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


评论 46
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值