當前位置:
首頁 >
三层之抽象工厂加反射实例
發布時間:2025/6/15
45
豆豆
生活随笔
收集整理的這篇文章主要介紹了
三层之抽象工厂加反射实例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C#版的三層登陸實例,只是為了學習三層而實現的。為了接下來需要進行的vb.net版機房收費系統。根據上次的C#改編的vb.net版本登陸實例。不過在驗收的時候發現了很多問題,所以進行了修改。
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??
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??
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??
Public?Interface?IFactory??????????'工廠類?? ????Function?CreateUser()?As?LoginIDAL.IUser?? End?Interface??
[vb] view plaincopy Public?Interface?IUser?? ????Function?SelectUser(ByVal?user?As?Login.Moudel.UserInfoEntity)?As?Login.Moudel.UserInfoEntity?? End?Interface??
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??
???花費好幾天的時間,終于從C#轉化成了vb.net版本。期間參考了一些師哥師姐的博客來理解三層是如何交互的。
起初上一篇實例,并不是很懂,只是理解了個大概。然后根據那么多材料來進行對比。終于看懂他們是怎么進行操作的。就說看了那么多不同樣式的實例之后,才知道誰的設計方案更好。知識是不變的,但是設計理念就能看出代碼執行效率的高低。
?
???在使用三層的過程中,才能真正體會到,什么叫高內聚,低耦合。在程序發現錯誤之后,能把錯誤的細節定位到具體一層,甚至具體一類。僅僅修改或更換這一類就能調試出來。使得調試代碼的量變的極底。這就是使用三層的好處吧。
???以下是本實例的設計,這個實例是模仿上篇實例得到的。所以名稱有些不規范,請見諒。
?
數據庫還是使用的上次的數據可,沒有變動。
?
通過對實例的不斷分解,單一職責劃分。得到下圖的引用關系。
?
接下來看一下各個層次的代碼:
?
UI層:
?
[vb] view plaincopy
B層:
D層:
[vb] view plaincopy?
[vb] view plaincopyIDAL:
?
Entity:
總結:三層架構,只是一種設計理念。幫助我們來優化代碼,降低代碼之間的耦合。僅僅通過幾天的學習,是不可能全部掌握的。這種東西,就好比學習 面向對象的 思想, 需要在長期的實踐 應用中,才能體會到里面的精髓。
總結
以上是生活随笔為你收集整理的三层之抽象工厂加反射实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅析三层架构与MVC模式的区别
- 下一篇: 为什么需要实体类