微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

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

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

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

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

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

UI层:

Public Class Form1

    Private Sub btnLogin_Click(sender As Object,e As EventArgs) Handles btnLogin.Click
        Try
            Dim user1 As New Login.Moudel.UserInfoEntity
            Dim user2 As New Login.Moudel.UserInfoEntity    '使用user2来进行登陆

            user2.USERNAME = txtUserName.Text.Trim
            user2.PASSWORD = txtPassword.Text

            Dim mgr As New Login.BLL.LoginManager
            user1 = mgr.SelectUserLogin(user2)      '将登陆返回的结果存放到user1中

            MessageBox.Show("登陆用户:" + user1.USERNAME)       '通知用户登陆成功
        Catch ex As Exception
            MessageBox.Show(ex.Message.ToString())      '登陆失败,通知用户
        End Try

    End Sub

    '退出系统
    Private Sub btnExit_Click(sender As Object,e As EventArgs) Handles btnExit.Click
        End
    End Sub
End Class


B层:

Public Class LoginManager
    Function SelectUserLogin(ByVal User As Login.Moudel.UserInfoEntity) As Login.Moudel.UserInfoEntity
        Dim bUser As LoginIDAL.IUser
        bUser = Factory.DataAccess.createuser()

        Dim rUser As New Login.Moudel.UserInfoEntity     '定义一个数据实体

        rUser = bUser.SelectUser(User)       '根据参数 查找数据库  并返回一个实体


        If Isnothing(rUser.USERNAME) Then       '判断用户名是否存在
            Throw New Exception("用户名 不存在")
        End If

        If rUser.PASSWORD = User.PASSWORD Then  '判断密码是否正确
            Return rUser
        Else
            Throw New Exception("登陆失败,请检查用户名密码")
        End If
    End Function
End Class

D层:

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

Imports System.Data.sqlClient
Imports System.Data

Public Class sqlServerDAO : Implements LoginIDAL.IUser
    Function SelectUser(ByVal user As Login.Moudel.UserInfoEntity) As Login.Moudel.UserInfoEntity Implements LoginIDAL.IUser.SelectUser
        Dim conn As New sqlConnection           '创建链接对象
         Dim cmd As New sqlCommand               '创建命令对象
        conn = New sqlConnection(DbConnStr.Connstring())    '链接数据库
        cmd.Connection = conn

        cmd.CommandText = "Select * from Users Where UserName=@UserName" ' and Password=@Password"
        cmd.Parameters.Add(New sqlParameter("@UserName",user.USERNAME))
        'cmd.Parameters.Add(New sqlParameter("@Password",user.PASSWORD))
        cmd.CommandType = CommandType.Text
        conn.open()

        Dim reader As sqlDataReader = cmd.ExecuteReader        '执行生成一个dataReader
        Dim rUser As New Login.Moudel.UserInfoEntity            '用于保存返回实体

        While (reader.Read())
            rUser.USERNAME = reader.GetString(1)
            rUser.PASSWORD = reader.GetString(2)
            rUser.LEVEL = reader.GetString(3)
            rUser.EMAIL = reader.GetString(4)
        End While

        Return rUser    '返回取出得到的实体
        conn.Close()

    End Function
End Class

IDAL:


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


Entity:

Public Class UserInfoEntity
    Private _userID As String
    Private _userName As String
    Private _password As String

    Public Property USERNAME() As String     '属性用户名
        Get
            Return _userName
        End Get
        Set(value As String)
            _userName = value
        End Set
    End Property

    Public Property PASSWORD() As String   '属性用户名密码
        Get
            Return _password
        End Get
        Set(value As String)
            _password = value
        End Set
    End Property


End Class

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

原文地址:https://www.jb51.cc/vb/258070.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐