結構概述
- 多層結構的劃分方式:實體、邏輯
- 兩層/三層結構
- 實體上的三層:顯示層、業務層、資料層
- 邏輯上劃分VS實體上劃分
- 實體:顯示層、業務層、資料層
- 邏輯:UI、BLL+DAL、DB
我們讨論的是UI(顯示層)、BLL(業務邏輯層)、DAL(資料通路層)
為什麼要分層?
1、解耦
目的是為了“高内聚、低耦合”
内聚:一個子產品内各個元素彼此結合的緊密程度
耦合:一個軟體結構内不同子產品之間互連程度的度量
2、複雜問題簡單化
各個分層分工明确,将一個複雜問題簡單拆分了
3、便于系統維護與更新
各層間通過接口解耦,接口與實作分離,進而可以非常簡單的替換掉實作,或者實際實作
4、為了管理和維護
使軟體開發有條理有秩序,一目了然
UI、BLL、DAL分别是什麼?
UI(表現層):展現給使用者的界面
BLL(業務邏輯層):針對具體問題的操作,也可以說是對資料層的操作,對資料業務邏輯的處理
DAL(資料通路層):所做事務直接操作資料庫,針對資料的增、删、改、查。将存儲在資料庫中的資料送出給B層,同時将B層處理的資料儲存在資料庫
D層的這些操作都是基于U層的。使用者的需求反映給界面U層,U層反映到B層,B層反映給D層,D層進行資料的操作,操作後再一一傳回,直到将使用者所需資料回報給使用者
應用場景
為什麼要使用三層架構?
代碼量比之前少
修改也友善
實作了代碼的重用性
什麼情況下需要使用?
1、既有資料通路層
2、也有業務邏輯層(BLL層)
當業務複雜到一定程度後,當資料存儲到相應的資料庫或者獨立的資料存儲媒體的情況下,需要使用三層結構
什麼情況下不需要三層結構?
1、業務邏輯簡單
2、沒有真正的資料存儲層
資料通路層
DAL的作用
- 從資料源加載資料(Select)
- 向資料源寫入資料(Insert、Update)
- 從資料源删除資料(Delete)
登入操作
public class UserDAO
{
public bool SelectUser(string userName,string Prossword)
{
throw new NotImplementedException();
}
}
具體操作資料源的具體對象
public class ScoreDAO
{
public void UpdateScore(string userName,int value)
{
throw new NotImplementedException();
}
}
顯示層
UI的作用
- 向使用者展現特定業務資料
- 采集使用者的輸入資訊和操作
UI設計的原則
- 使用者至上
- 兼顧簡潔
業務邏輯層
BLL的作用
- 從DAL中擷取資料,以供U層顯示用
- 從U層中擷取使用者指令和資料,執行業務邏輯
- 從U層中擷取使用者指令和資料,通過D層寫入資料源
BLL的職責機制
- UI->BLL->UI
- UI->BLL->DAL->BLL->UI
具體應用
原則
DAL:隻提供基本的資料通路,不包含任何業務相關的邏輯處理
UI:負責顯示和采集使用者操作,不包含任何的業務相關的邏輯處理
BLL:負責處理業務邏輯。通過擷取UI傳來的操作指令,決定執行業務邏輯,在需要通路資料源的時候直接交給DAL處理。處理完成後,傳回必要資料給UI
程式集(Assembly)
- DAL、B:LL、UI分别在不同的程式集中
- 各個層之間的引用關系
- UI->BLL->DAL
- DAL所在程式集不引用BLL和UI
- BLL需要引用DAL
- UI直接引用BLL。可能會間接引用DAL
- UI->BLL->DAL