每當別人問我關于三層的知識的時候我總是推薦自己的《三層架構之抽象工廠加反射》這篇博客。這篇博客是自己當時學習三層的時候寫的一個簡單的登錄例子。這個例子通過登錄這個用例簡單的介紹了三層,然后過度的三層+簡單工廠再過渡到三層+抽象工廠。不管說從方法命名或者代碼風格上來說自己都不敢說是最好的,但是體現三層我感覺還是綽綽有余的。然而最近在給別人講述三層時候被他人指出這篇博客的代碼有些許錯誤,雖然別人指出的方式有些令自己不快,甚至氣憤!但是畢竟還有人關注自己,還有人看自己的博客,還有人給自己指出不足,從這個方面來看這還應該算是好事。有錯誤就改!有錯誤才能進步嘛。也許這就是米老師總是說的教學相長吧,這次終于體會到了,而且體會很深刻!!!
真的是“知不足”了,真的是想“自強”了,為了驗證代碼的正確性決定將這個登錄的小例子又從最簡單的三層開始做起逐步增加難度(降低耦合度),重新實現了一遍。再一次用了用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>
對于知識的認知真的是每次都有不同的感受,以前的目標只是實現,無論怎么樣只要實現就好,有很多地方都是不理解的,現在再去看那些代碼感覺理解起來輕松了很多。敲代碼的過程中感觸最大的就是java和net平臺的區別。通過這段時間做DRP的經歷明顯感覺net簡直是傻瓜化的操作,而java操作起來就要煩人的多,也許現在還是對java的IDE不太熟悉吧。