每當別人問我關于三層的知識的時候我總是推薦自己的《三層架構之抽象工廠加反射》這篇博客。這篇博客是自己當時學習三層的時候寫的一個簡單的登錄例子。這個例子通過登錄這個用例簡單的介紹了三層,然后過度的三層+簡單工廠再過渡到三層+抽象工廠。不管說從方法命名或者代碼風格上來說自己都不敢說是最好的,但是體現三層我感覺還是綽綽有余的。然而最近在給別人講述三層時候被他人指出這篇博客的代碼有些許錯誤,雖然別人指出的方式有些令自己不快,甚至氣憤!但是畢竟還有人關注自己,還有人看自己的博客,還有人給自己指出不足,從這個方面來看這還應該算是好事。有錯誤就改!有錯誤才能進步嘛。也許這就是米老師總是說的教學相長吧,這次終于體會到了,而且體會很深刻?。?!


教學相長

雖有嘉肴,弗食不知其旨也;雖有至道,弗學不知其善也。是故學然后知不足,教然后知困。知不足,然后能自反也;知困,然后自強也。故曰:教學相長也。

----摘自《礼記?學記》


真的是“知不足”了,真的是想“自強”了,為了驗證代碼的正確性決定將這個登錄的小例子又從最簡單的三層開始做起逐步增加難度(降低耦合度),重新實現了一遍。再一次用了用VB.NET,再次回到了傻瓜式的VS環境中。

代碼如下:

 簡單三層

界面層

Public Class Login
    Private Sub btnLogin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLogin.Click
        Dim LUser As New Entity.User
        Dim BCheck As New Bll.BllLogin
        LUser.User_Id = txtUserId.Text
        LUser.User_Pwd = txtPwd.Text
        If BCheck.Check(LUser) = True Then
            MsgBox("登錄成功!")
        Else
            MsgBox("登錄失敗!")
        End If
    End Sub
    Private Sub btnCancle_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancle.Click
        End
    End Sub
End Class


BLL層

Public Class BllLogin
    Function Check(ByVal User As Entity.User) As Boolean
        Dim DaUser As New DAL.DalUserInfo
        Dim BlUser As New Entity.User
        BlUser.User_Id = User.User_Id
        BlUser = DaUser.Check(BlUser)
        If BlUser.User_Pwd = User.User_Pwd Then
            Return True
        Else
            Return False
        End If
    End Function
End Class


DAL層

Imports System.Data.SqlClient
Public Class DalUserInfo
    Dim ConnStr As String = "Data Source=192.168.24.186;Initial Catalog=Student;User ID=sa;Pwd=123456"
    Dim conn As SqlConnection = New SqlConnection(ConnStr)
    Function Check(ByVal User As Entity.User) As Entity.User
        Dim sql As String = "select * from UserInfo where User_ID='" & User.User_Id + "'"
        Dim cmd As SqlCommand = New SqlCommand(sql, conn)
        Dim read As SqlDataReader
        Try
            conn.Open()
            read = cmd.ExecuteReader
            read.Read()
            User.User_Id = read.Item("User_ID")
            User.User_Pwd = read.Item("User_Pwd")
            Return User
        Catch ex As Exception
            User.User_Pwd = ""
            Return User
        End Try
    End Function
End Class


實體層

Public Class User
    Private userId As String
    Private userPwd As String
    Public Property User_Id() As String
        Get
            Return userId
        End Get
        Set(ByVal value As String)
            userId = value
        End Set
    End Property
    Public Property User_Pwd() As String
        Get
            Return userPwd
        End Get
        Set(ByVal value As String)
            userPwd = value
        End Set
    End Property
End Class


三層+簡單工廠

界面層代碼不變

Bll層

Public Class BllLogin
    Function Check(ByVal User As Entity.User) As Boolean
        Dim DalFactory As New DAL.DFactory
        Dim BlUser As New Entity.User
        BlUser.User_Id = User.User_Id
        BlUser = DalFactory.CreateUserInfo.Check(BlUser)
        If BlUser.User_Pwd = User.User_Pwd Then
            Return True
        Else
            Return False
        End If
    End Function
End Class


工廠

Imports [Interface]
Public Class DFactory
    'Dim DataBase As String = "Access"
    Dim DataBase As String = "Sql"
    Function CreateUserInfo() As IUserInfo
        Dim DB As IUserInfo
        Select Case DataBase
            Case "Sql"
                DB = New DalUserInfo
                'Case "Access"
                ' DB = New D_UserInfoAccess
        End Select
        Return DB
    End Function
End Class


接口

Public Interface IUserInfo
    Function Check(ByVal IUser As Entity.User) As Entity.User
End Interface


DAL層

Imports System.Data.SqlClient
Public Class DalUserInfo : Implements [Interface].IUserInfo
    Dim ConnStr As String = "Data Source=192.168.24.186;Initial Catalog=Student;User ID=sa;Pwd=123456"
    Dim conn As SqlConnection = New SqlConnection(ConnStr)
    Public Function Check(ByVal IUser As Entity.User) As Entity.User Implements [Interface].IUserInfo.Check
        Dim sql As String = "select * from UserInfo where User_ID='" & IUser.User_Id + "'"
        Dim cmd As SqlCommand = New SqlCommand(sql, conn)
        Dim read As SqlDataReader
        Try
            conn.Open()
            read = cmd.ExecuteReader
            read.Read()
            IUser.User_Id = read.Item("User_ID")
            IUser.User_Pwd = read.Item("User_Pwd")
            Return IUser
        Catch ex As Exception
            IUser.User_Pwd = ""
            Return IUser
        End Try
    End Function
End Class


三層+抽象工廠

界面層代碼不變

Bll層代碼不變

接口代碼不變

工廠代碼

Imports [Interface]
Imports System.Reflection
Public Class DFactory
    'Dim DataBase As String = "Access"
    'Dim DataBase As String = "Sql"
    Dim strDB As String = System.Configuration.ConfigurationSettings.AppSettings("DBString")
    Function CreateUserInfo() As IUserInfo
        Return CType(Assembly.Load("DAL").CreateInstance("DAL.DalUserInfo" & strDB), IUserInfo)
    End Function
End Class


DAL層

Imports System.Data.SqlClient
Public Class DalUserInfoSql : Implements [Interface].IUserInfo
    'Dim ConnStr As String = "Data Source=192.168.24.186;Initial Catalog=Student;User ID=sa;Pwd=123456"
    Dim strConnStr As String = System.Configuration.ConfigurationSettings.AppSettings("ConnStr")
    Dim conn As SqlConnection = New SqlConnection(strConnStr)
    Public Function Check(ByVal IUser As Entity.User) As Entity.User Implements [Interface].IUserInfo.Check
        Dim sql As String = "select * from UserInfo where User_ID='" & IUser.User_Id + "'"
        Dim cmd As SqlCommand = New SqlCommand(sql, conn)
        Dim read As SqlDataReader
        Try
            conn.Open()
            read = cmd.ExecuteReader
            read.Read()
            IUser.User_Id = read.Item("User_ID")
            IUser.User_Pwd = read.Item("User_Pwd")
            Return IUser
        Catch ex As Exception
            IUser.User_Pwd = ""
            Return IUser
        End Try
    End Function
End Class


配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client" />
  </startup>
  <appSettings>
    <add key="ConnStr" value ="Data Source=192.168.24.186;Initial Catalog=Student;User ID=sa;Pwd=123456"></add>
    <add key="DBString" value ="Sql"></add>
  </appSettings>
</configuration>


對于知識的認知真的是每次都有不同的感受,以前的目標只是實現,無論怎么樣只要實現就好,有很多地方都是不理解的,現在再去看那些代碼感覺理解起來輕松了很多。敲代碼的過程中感觸最大的就是javanet平臺的區別。通過這段時間做DRP的經歷明顯感覺net簡直是傻瓜化的操作,而java操作起來就要煩人的多,也許現在還是對javaIDE不太熟悉吧。

作者:beijiguangyong 發表于2012-1-14 1:11:25 原文鏈接
閱讀:1682 評論:19 查看評論