通常在程式程式設計中我們所說的三層架構是指:顯示層(ui)、邏輯層(bll)和資料訪問層(dal)。對於這三層來說,分工明白,各自有各自負責的領域。
ui層:1、負責向使用者顯示資料 2.負責採集使用者輸入的資訊
bll層:1.從dal獲取資料。以供ui顯示 2.從ui中獲取指令或資料。經業務邏輯送達到dal
dal層:1.主要用於對資料來源的增刪改查的操作。
通過它們各自負責的領域我們能夠看出。bll層屬於中間層。它負責ui和dal層之間的通訊。那麼通常我們還會增加乙個實體層(enity):主要負責返回實體,在上述三層之間傳遞引數。
那麼為什麼要劃分三層呢?
通過劃分三層。能夠使得各部分功能非常好的被封裝在乙個包中。各自負責各自的功能,互不打攪。這符合物件導向封裝的思想。
使得各個模組之間達到高內聚、低耦合。以至於乙個部分的更換或改動不至於影響到整個專案的實施程序。
那麼這三層之間是怎樣進行通訊的呢?
ui層引用bll層。bll層引用dal層,它們三者同一時候都引用enity。
但是,為什麼不能迴圈引用(bll引用ui,dal引用bll,dal引用ui)呢?事實上這就是回到了為什麼要分三層,分三層是為了封裝。假設繼續迴圈引用,那麼就跟分三層沒有不論什麼差別。各個引數和資料隨便傳遞,沒有界限。
在這裡,我們要知道enity是用來供三層之間相互通訊。傳遞資料的。可是基於三層封裝的思想,三層在傳遞引數時,傳遞的應該是乙個實體。而不是實體中的某個引數。這個符合設計模式中的依賴倒轉原則,依賴抽象而不依賴細節,事實上也就是封裝。
為了更清楚理解上述的這些知識。
我用vb.net做了乙個三層關於登入的乙個小樣例:
enity層:將程式中所要傳遞的引數進行宣告
public class loginenity
''' ''' 使用者id
'''
'''
private user_id as integer
public property userid() as string
set(value as string)
user_id = value
end set
getreturn user_id
end get
end property
''' ''' username
'''
'''
private user_name as string
public property username() as string
set(value as string)
user_name = value
end set
getreturn user_name
end get
end property
''' ''' 使用者password
'''
'''
private _pwd as string
public property password()
set(value)
_pwd = value
end set
getreturn _pwd
end get
end property
end class
ui層:引用bll的業務邏輯進行顯示資料
private sub butlogin_click(sender as object, e as eventargs) handles butlogin.click
dim user as new enity.loginenity '例項化實體
user.username = txtusername.text
user.password = txtpassword.text
dim managerbll = new bll.loginbll 'ui層引用bll層
if managerbll.useri***ist(user) = true then '利用bll層中的函式進行邏輯推斷
frmquery.show()
else
messagebox.show("登入失敗!")
end if
end sub
bll層:引用dal進行邏輯推斷
public function useri***ist(byval user as enity.loginenity) as boolean '注意這裡傳遞的為乙個實體。而不是詳細的某個引數
dim manager as new dal.logindal '引用dal層。進行例項化
dim euser as new enity.loginenity '引用實體層
tryeuser = manager.useri***ist(user) '利用dal中的函式進行驗證
if user.username = euser.username and user.password = euser.password then'進行邏輯推斷
return true
else
return false
end if
catch ex as exception '對dal層中丟擲的錯誤進行錯誤處理
return false
end try
end function
dal層:主要負責對資料來源中資料的增刪改查等操作。
public function useri***ist(byval user as enity.loginenity) as enity.loginenity 』引數傳遞為實體
'進行資料庫連線相關**的編寫
dim sqlconn = new sqlconnection(dbutil.strconn)
dim cmdtext as string = "select username,password from user_login where username=@username and password=@password"
dim cmd as new sqlcommand(cmdtext, sqlconn)
'加入引數
cmd.parameters.add(new sqlparameter("@username", user.username))
cmd.parameters.add(new sqlparameter("@password", user.password))
dim reader as sqldatareader
sqlconn.open() '開啟資料連線
reader = cmd.executereader() '從資料庫中讀取資料
if (not user is nothing) then
if reader.read() then
user.username = reader.item("username")'與資料來源中的資料進行驗證。是否一致
user.password = reader.item("password")
else
throw new system.exception("無記錄!
") '若不存在此條記錄。丟擲錯誤 end if end if return user sqlconn.close() '關閉連線 cmd = nothing end function
通過以上的小樣例,我們能夠看出,事實上每個小樣例都能夠由ui、bll和dal這三層構成。
而實體層則負責資料傳遞,它將各個層連線成了一條線。從這樣的角度講,每個程式都是有若干條類似的線組成的。
小結:所謂三層架構,基於物件導向的思想。事實上能夠看做一種非經常常使用的設計模式。只是這個設計模式是作用於整個程式的乙個框架設計,它的應用更加普遍。更加巨集觀。
而我們通常學習的設計模式則是針對於於**中詳細某個業務或是某個領域,它針對的是更加細節的地方。
而三層框架的設計和設計模式的共同應用才構成了我們靈活多變的程式設計。
三層架構 理論篇
通常意義上的三層架構就是將整個業務應用劃分為 表現層 ui 業務邏輯層 bll 資料訪問層 dal 區分層次的目的即為了 高內聚。低耦合 的思想。1 表現層 ui 通俗講就是展現給使用者的介面。即使用者在使用乙個系統的時候他的所見所得。2 業務邏輯層 bll 針對詳細問題的操作,也能夠說是對資料層的...
解析三層架構 如何分層?
三層結構是基於模組化程式設計的思想,為實現分解應用程式的需求,而逐漸形成的一種標準模式的模組劃分方法。三層架構的優點在於不必為了業務邏輯上的微小變化而遷至整個程式的修改,只需要修改商業邏輯層中的乙個函式或乙個過程 增強了 的可重用性 便於不同層次的開發人員之間的合作,只要遵循一定的介面標準就可以進行...
三層架構與MVC
三層架構分為表示層 ui 業務邏輯層 bll 資料訪問層 dal dal 直接運算元據庫,針對資料的增 刪 改 查。bll 針對具體問題,對資料層操作,對資料業務邏輯進行處理。ui 頁面展示。mvc是在表示層 ui 中再度進行分化,分成實體 model 檢視 view 控制器 control mod...