机房重构七层之登录

来源:互联网 发布:saas软件租用模式合同 编辑:程序博客网 时间:2024/05/21 20:28

   七层听起来是不是很高大尚那,其实七层就是在三层的基础上加了Entity实体层Facade外观层,Factory工厂层,IDAL层,

Entity实体层:就是存储数据的,方便在各个层之间传递数据,多数作为类中方法的参数

Facade外观层:其实就是用了一个外观模式,作用就是接触B层与U层之间的耦合

Factory工厂层:就是用到了抽象共产+反射+配置文件,作用是灵活的实现数据库的连接,方便换数据库

IDAL层::就是提供接口

配置文件:写在U层的App.config里面

<?xml version="1.0" encoding="utf-8" ?><configuration>    <startup>        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />    </startup>  <appSettings>    <add key="SqlConnStr" value="server=.;database=charge_sys;User ID=sa;Password=1"/>    <add key="DB" value="Login.DAL"/>    </appSettings></configuration>

U层:(怎样在加载窗体时就让指定文本框获得焦点可以看一下)

Public Class Form1    Private Sub btnOk_Click(sender As Object, e As EventArgs) Handles btnOk.Click        '实例化实体层UserInfo对象,用于在各层之间进行传递数据        Dim entigyObject As New Login.Entity.UserInfo                '定义变量接受Facade层的返回值        Dim facadeReturn As Boolean                Dim facadeObject As New Login.Facade.IsUserOk        '判断用户名或密码是否输入        If (txtPassword.Text = "" Or txtUsername.Text = "") Then            MessageBox.Show("请输入用户名或密码")            Exit Sub        End If        '将文本框的内容传递给dataUser对象        entigyObject.UserId = txtUsername.Text.Trim()        entigyObject.PWD = txtPassword.Text.Trim()        '通过U层将entigyObject传递给Facade层        facadeReturn = facadeObject.OneInterfaceUser(entigyObject)        '判断是否存在输入的用户        Try            If facadeReturn = False Then                MessageBox.Show("用户名或密码错误!", "温馨提示")                txtUsername.Text = ""                txtPassword.Text = ""                txtUsername.Focus()            Else                MessageBox.Show("登录成功", "恭喜你")            End If        Catch ex As Exception            MsgBox(ex.Message)            txtUsername.Text = ""            txtPassword.Text = ""            txtUsername.Focus()        End Try    End Sub    Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click        Me.Close()    End Sub    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load        'txtUsername.Focus()        Me.ActiveControl = Me.txtUsername '使文本框获得焦点    End Sub
Public Class IsUserOk '是否存在该用户    Public Function OneInterfaceUser(ByVal entigyObject As Login.Entity.UserInfo) As Boolean        '实例化B层对象        Dim bllObject As New Login.BLL.HaveLoginUser        '定义变量接受bllObject返回值        Dim bllReturn As Boolean        '通过Facade层将entity传递给B层        bllReturn = bllObject.isUserExist(entigyObject)        Return bllReturn    End FunctionEnd Class

Private Sub txtUsername_KeyDown(sender As Object, e As KeyEventArgs) Handles txtUsername.KeyDown If e.KeyCode = Keys.Enter Then txtPassword.Focus() End If End Sub Private Sub txtPassword_KeyDown(sender As Object, e As KeyEventArgs) Handles txtPassword.KeyDown If e.KeyCode = Keys.Enter Then btnOk.Focus() End If End SubEnd Class

Facade层

Public Class IsUserOk '是否存在该用户    Public Function OneInterfaceUser(ByVal entigyObject As Login.Entity.UserInfo) As Boolean        '实例化B层对象        Dim bllObject As New Login.BLL.HaveLoginUser        '定义变量接受bllObject返回值        Dim bllReturn As Boolean        '通过Facade层将entity传递给B层        bllReturn = bllObject.isUserExist(entigyObject)        Return bllReturn    End FunctionEnd Class

B层

Public Class HaveLoginUser    '判断用户是否存在    Public Function isUserExist(ByVal entityObject As Login.Entity.UserInfo) As Boolean        '定义接口        Dim iDalObject As Login.IDAL.ISelectUserAccess        '实例化工厂        Dim factoryObject As New Login.Factory.DataAccess        '调用工厂方法,创建接口        iDalObject = factoryObject.CreatUser()        '定义数据库表变量,接受IDAL接口层返回值        Dim table As New DataTable        Dim inflence As New Integer        '实现接口的方法        table = iDalObject.SelectUser(entityObject)        '判断是否有记录,有返回true,否则返回false        If Not table Is Nothing Then  '首先判断是否为空,不为空的情况下才能判断是否有记录            If table.Rows.Count = 0 Then                Return False            Else                inflence = iDalObject.OnWorkInfo(entityObject)                Return True            End If        Else            Return False        End If    End FunctionEnd Class

Factory层

Public Class DataAccess    Private Shared ReadOnly AssemblyName As String = "LoginDAL" '为什么用shared,参数代码什么    '读配置文件    Dim db As String = System.Configuration.ConfigurationSettings.AppSettings("DB")    'System.Configuration.ConfigurationManager.AppSettings("DB")    Public Function CreatUser() As Login.IDAL.ISelectUserAccess        Dim className As String = db + "." + "UserData"        Return CType(Assembly.Load(AssemblyName).CreateInstance(className), Login.IDAL.ISelectUserAccess)    End FunctionEnd Class

IDAL层

Public Interface ISelectUserAccess    '定义方法,看数据库中是否有该用户,D层实现IDal层    Function SelectUser(ByVal selectuserInfo As Login.Entity.UserInfo) As DataTableEnd Interface

D层

Public Class UserData : Implements Login.IDAL.ISelectUserAccess '实现IDal层的接口    '在数据库表User中查找有登录界面的用户,    Public Function SelectUser(ByVal selectuserInfo As Login.Entity.UserInfo) As DataTable Implements Login.IDAL.ISelectUserAccess.SelectUser        '实例化SQLHelper对象        Dim sqlHelperObject As New SQLHelper        Dim sql As String        '定义变量,接受数据库返回的数据        Dim table As New DataTable        '实例化参数数组,赋值        Dim sqlParams As SqlParameter() = {New SqlParameter("@UserID", selectuserInfo.UserId), New SqlParameter("@Password", selectuserInfo.PWD)}        'sql语句执行查询        sql = "select * from User_Info where userId=@UserID and PWD=@Password"        '调用SQLHelper类中的ExecSqlSelect方法执行select语句查询        table = sqlHelperObject.ExecSqlSelect(sql, CommandType.Text, sqlParams)        Return table    End Function

SqlServer类:因为会涉及到很多连接数据库的时候,为防止连接数据库部分代码重复编写,把该部分代码抽象出来,形成一个单独的类,可以放到D层,也可另建一层,那这样就是所谓的8层了

    Public Function ExecSqlSelect(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal paras As SqlParameter()) As DataTable        '创建数据库连接,并用using及时关闭,用到配置文件连接数据库        Using conn As New SqlConnection(strConnection)            '创建command命令,目的执行命令(增删改查)            Dim cmd As SqlCommand = conn.CreateCommand()            '定义适配器(相当于稳压器),面对的是个庞大的数据库系统,而你只需要其中的几张表,挑选作用            '(包括select,inset,update,deletecommand),与sqlconnection和sqlcommand一起使用,提高连接数据库的性能            '目的就是填充DataSet            Dim adp As SqlDataAdapter            '定义数据集对象,用于存储临时数据表            Dim ds As New DataSet            '命令是文本形式            cmd.CommandText = cmdText            '命令执行的类型            cmd.CommandType = cmdType            '命令执行的参数            cmd.Parameters.AddRange(paras)            '初始化适配器,            adp = New SqlDataAdapter(cmd)            Try                '重新打开数据库                conn.Open()                '向Adapter体重查询的结果                adp.Fill(ds)                '返回包含在DataSet中表集合中的第一张表                Return ds.Tables(0)            Catch ex As Exception                Return Nothing                Throw ex            End Try        End Using    End Function

【总结】

本文章有待完善,先仅供代码。。。

0 0
原创粉丝点击