** 本文同步發表於 FB社群-軟體設計鮮思維 **
- 基於 DDD (Domain Driven Design) 設計思維的一種架構呈現。
- 洋蔥的中心即爲系統最爲穩固的核心 (如圖爲 Domain Model)。
- 本質仍為三層式 (3-tier) 分層,亦即展示、應用邏輯、資料存取的分層,但特別強調相依反轉 (IoC, Inverse of Control)。
Onion Architecture 分層 (Layer)
- Domain Model (領域模型)
- Domain Service (領域服務)
- Application Service (應用服務)
- Infrastructure (基礎建設)
Domain Model (領域模型)
- 企業系統的核心主結構
- 包含業務邏輯 (business logic) 與實體 (entity)
- 傳統物件導向 (object-oriented) 依據領域概念 (domain concepts) 來組成系統的類別模型
- Ex. Order, OrderLineItem, Product, Customer, ShoppingCart, etc.
Domain Service (領域服務)
- 封裝 (encapsulate) 多個實體物件 (entity object) 的互動行爲,對外提供統一的進入點 (entry point)
- 屬於顆粒度較粗 (coarse-grained) 的領域服務物件。
- Ex. OrderContext, ShoppingCartContext, etc.
Application Service (應用服務)
- 會調用 (invoke) 領域服務與透過基礎建設取得的邊界資源 (例如資料庫存取),以達成某一特定的領域功能需求
- 負責處理領域的控制邏輯 (domain control logic)
- Ex. PlaceOrderService, PlaceShoppingCartService, etc.
Infrastructure (基礎建設)
- 界定存取資料庫的儲庫 (repository)物件、連結外部系統的 Adapter 物件、提供外界存取的 Web API 物件, etc.
- Ex. PlaceOrderRepository, VerifyCreditCardAdatper, http://api.example.com/cart-management/users/{id}/cart/checkout, etc.
洋蔥架構的特點
- 本質仍是展示 (presentation)、應用邏輯 (application logical)、資料存取 (data access) 的分層原則
- 強調越往洋蔥的核心的分層越是穩固
- 強調外層與內層的相依反轉 (dependency inverse),亦即內層的核心不直接呼叫外層的服務,而是由外層反轉注入 (inject) 至內層的核心。
- 相當適合單一微服務內部結構的分層界定規劃
- 確保了靈活性、可持續性與可移植性
- 由於應用核心是獨立的,因此可以快速測試系統核心邏輯