商務邏輯層簡介
的粗黑色邊框的部分就是商務邏輯層,可以包含下面的內容:
- application facade套用面板。這個可選的組件為商務邏輯組件提供一個簡單的介面,通常會將多個業務操作合并為一個操作,使得商務邏輯層更容易使用。可以減少依賴,因為外部調用者不需要知道商務邏輯組建的實現細節和他們之間的關係。
- 商務邏輯組件。在任何應用中,商務邏輯的定義都會集中在擷取資料、處理資料、傳輸資料,管理應用的資料、商務規則和策略,保證資料的一致性和合法性。為了最大化的重用,商務邏輯組件不應該包括任何行為。商務邏輯組建可以分為下面的兩個目錄。
- 業務工作流程組件。在UI從使用者處收集需要的資料並且傳遞給商務邏輯層之後,應用將使用這些資料實現業務功能。
- 業務實體組件。業務實體,也被叫做業務對象,代表真實世界的元素,例如:客戶和訂單。儲存資料,暴露屬性。
通常的設計考慮
- 在設計商務邏輯層的時候,通過將不同的任務分離到不同的關注點領域,軟體架構的目標已經被最小化複雜性。例如:代表不同關注點領域的處理商務規則的邏輯,業務工作流程,業務實體。在每一個領域,組件的設計應該集中在該領域,不應該包括其他領域的相關代碼。可以參考下面的原則:
- 決定你是否需要獨立的商務邏輯層。使用獨立的商務邏輯層對於提高應用的可維護性是一個好主意。例外的情況是除了資料驗證,沒有其他的商務邏輯。
- 確定商務邏輯層的職責和消費者。可以協助你決定商務邏輯層必須要做什麼,如何暴露商務邏輯層。使用商務邏輯層處理複雜的業務,傳輸資料,應用策略,和資料驗證。如果你的商務邏輯層可能會被外部的應用使用,考慮使用服務形式暴露商務邏輯層。
- 在商務邏輯層不要混合其他組件。避免將表現層和資料訪問層代碼放在商務邏輯層,從表現層和資料訪問層解耦商務邏輯,可以簡化商務邏輯的測試性。使用商務邏輯層集中管理商務邏輯,可以提供可重用性。
- 訪問一個遠端商務邏輯層的時候減少往複。如果商務邏輯層部署在獨立的物理層,考慮實現訊息為基礎的遠程application facade,或者是服務層,考慮將細粒度的操作組合成粗粒度的操作,例如: Data Transfer Objects(DTO)。
- 避免層之間的緊耦合。為商務邏輯層建立介面的時候使用抽象來最小化耦合。抽象的技術包括:使用公用的對象介面,通用的介面定義,抽象基類,訊息。對於web應用來說,考慮在表現層和商務邏輯層之間使用訊息為基礎的介面。
特定的設計問題
在開發和設計的過程中,總會有一些常見的問題。這些問題在設計中可以分為不同的領域。下面列出常見的一些領域;
- authentication使用者驗證
- authorization使用者授權
- caching緩衝
- coupling and cohesion耦合和內聚
- exception management異常管理
- logging,auditing,and instrumentation日誌,審計,效能儀錶
- validation資料驗證
使用者驗證
- 對於應用的安全性和可靠性來說,設計一個有效使用者驗證策略是非常重要的。如果驗證失敗的話,你的應用會很容易受到欺騙攻擊、字典攻擊、工作階段劫持、和各種類型的攻擊。設計使用者驗證策略的時候,可以參考下面的原則:
- 避免在商務邏輯層驗證使用者,除非在一個可信的邊界內,並且它只被在一個物理層的表現層或者是服務層使用。
- 如果你的商務邏輯層需要被多個應用使用,使用獨立的使用者儲存,考慮實現SSO。避免設計自訂的驗證技術,相反,無論什麼時候,使用平台內建的技術。
- 如果表現層和商務邏輯層部署在同一個機器上,同時你一定要訪問使用者原始的ACL許可權,考慮實現impersonation。如果表現層和商務邏輯層部署在分開的機器,並且你一定要訪問使用者原始的ACL許可權,考慮實現代理。
授權
設計有效授權對於安全和可靠性是非常重要的。如果授權失敗,會造成資訊泄露,資料破壞。可以參考下面的設計原則:
- 使用基於身份的驗證保護資源。 帳戶組,角色,和其他的上下文資訊。
- 考慮使用角色為基礎的授權。
- 不要將授權碼混合在業務處理代碼中。
- 在應用中,授權是無處不在的。確保授權的基礎架構沒有影響效能。
緩衝
緩衝對於提高效能和響應性是非常重要的。使用緩衝最佳化資料的查詢,避免網路的往複,避免不要的重複處理。作為緩衝策略的一部分,你一定要考慮什麼時候、如何載入資料到緩衝中。為了避免用戶端的延遲,使用批處理非同步載入資料。可以參考下面的原則:
- 考慮緩衝在商務邏輯層有規律的重複使用的待用資料,避免緩衝容易發生變化的資料。考慮緩衝那些不能從資料庫快速、高效的擷取的資料,避免緩衝大量的資料。只緩衝最小需要。
- 考慮將緩衝的資料格式化成商務邏輯層可以使用的形式。
- 避免緩衝敏感性資料,或者是為緩衝的敏感性資料設計保護方法。
- 考慮網頁伺服器場部署的話,對於緩衝方案的影響。如果伺服器陣列中的任何服務都可以處理使用者請求的話,需要你的緩衝方案在服務中之間支援資料同步。
耦合與內聚
為商務邏輯層設計組件的時候,確保組件高內聚,實現層之間的鬆散耦合。可以協助提高應用的伸縮性。可以參考下面的原則:
- 避免循環參考。商務邏輯層應該只知道下面的資料訪問層,不應該知道上面的表現層或者直接存取邏輯層的其他應用。
- 使用抽象實現鬆散的介面。依賴於抽象,不依賴於實現。
- 為商務邏輯層設計緊耦合,除非動態行為需要鬆散耦合。
- 設計高內聚。組件應該只包括實現特定功能的組件。避免在商務邏輯層混合資料訪問邏輯。
- 設計訊息為基礎的介面,來暴露商務邏輯層,減少耦合,如果需要的話,可以部署在獨立的物理層。
異常管理
- 只捕獲你可以處理的內部異常。不要使用異常控制商務邏輯或者是應用流程。
- 設計適當的異常傳播策略。
- 設計異常日誌,記錄關鍵資訊,協助尋找錯誤,同時不要暴露敏感資訊。
日誌,審計,儀錶盤
參考下面的原則:
- 集中管理日誌,審計和商務邏輯層的儀錶盤。
- 不要在日誌中存在敏感資訊。
- 確保日誌失敗不影響商務邏輯層功能。
- 考慮使用審計和日誌記錄商務邏輯層的全部訪問行為。
資料驗證
考慮下面的原則:
- 在商務邏輯層驗證所有的輸入參數和方法參數,即使在表現層已經存在驗證的情況。
- 集中驗證方法,最大化可測試性和重用性。
- 限制,決絕,審核使用者輸入。換句話說,假定使用者的所有輸入都是不可信的。驗證輸入的長度、範圍、格式,以及類型。