EBI、DDD及其演變架構史
一、引子
聊架構總離不開「領域驅動架構」,大多能聊到DDD(Domain-Driven Design),實際上早期思想EBI架構 1992年就誕生了。核心價值點在於:關注核心業務領域(高內聚),分離實現層(低耦合)。後續一些演變架構有:端口和適配器架構、洋蔥架構、整潔架構、事件驅動架構。這一系列的架構演變,每個架構的核心思想了解下就好,不用糾結實現細節。
二、架構演變
2.1 EBI 架構(1992)
EBI 架構(Entity-Boundary-Interactor,實體-邊界-交互器)是Ivar Jacobson 在 1992 年就在他的著作 Object-Oriented Software Engineering: A use case driven approach中提出的。附上2012年來北京講座的照片,混個臉熟。
最早,Jacobson 把它叫做實體-接口-控制(Entity-Interface-Control),但是後來改成了 EBI,避免「接口」和編程語言中的結構「接口」混淆,以及「控制」和 MVC 中的「控制器」混淆。如下圖所示:
這個圖是不是很熟悉?沒錯,就是UML!Ivar Jacobson就是UML的三大創始人之一。
核心:
- Entity實體:實體對象承載着相關業務領域的數據和操作。對應着MVC的Model層。
- Boundary邊界:邊界對象是對系統接口的建模。所有依賴系統環境(工具和傳達機制)的功能都屬於邊界對象。對應着 MVC 中的 View 和 Controller 的整個展現層。
- Interactor交互器:代表了展現層和實體之間的連接,也就是應用服務(編排用例)和領域服務(DDD概念)。
優點:
- 通過職責的封裝將系統的變化控制在局部(最好是一個對象)。(單一職責原則)
2.2 DDD領域驅動設計(2003)
- 1.User Interface用戶界面層:負責繪製和應用交互的屏幕界面並將輸入翻譯成應用的命令。它們和EBI架構中的Boundary邊界對象對應。
- 2.Application應用服務層:協調領域對象完成用例。它不包含業務邏輯。應用層和EBI架構中的Interactor交互器相對應,只有一點不同,交互器是和界面或實體無關的任意對象,而這裡應用層只包含和用例相關的對象。
- 3.Domain領域層:這個層次包含了所有的業務邏輯,如領域服務、實體、事件和其他包含業務邏輯的任意對象類型。它和 EBI 架構中的Entity實體對象類型對應。
- 4.Infrastructure基礎設施層:支持上述三個層次的技術能力,例如,持久化或者消息機制。
核心:
領域模型準確反映了業務語言,而傳統數據對象除了簡單setter/getter方法外,沒有任何業務方法,即失血模型,那麼DDD領域模型就是充血模型(業務方法定義在實體對象中)。
優點:
- 首次清晰描述了領域驅動的分層實現並統一了業務語言。
- 單一職責、低耦合、高內聚、業務內核沉澱。
2.3 端口和適配器架構(2005)
核心:
- 左側: 代表 UI 的適配器被稱為主適配器,它們發起了對應用的一些操作,端口(應用層API)和它的具體實現(controller實現)都在應用內部。
- 右側: 表示和後端工具鏈接的適配器,被稱為從適配器,它們只會對主適配器的操作作出響應,端口在應用內部(業務接口),具體實現(impl)在應用之外。
優點:
-
業務應用和實現(技術)隔離。(面向接口編程)
- 方便測試。(基於接口)
2.4 洋蔥架構(2008)
洋蔥架構在業務邏輯中加入了一些在「領域驅動設計」中被識別出來的層次。如下圖:
核心:
- 圍繞獨立的對象模型構建應用。
- 內層定義接口,外層實現接口。
- 依賴的方向指向圓心。
- 所有的應用代碼可以獨立於基礎設施編譯和運行。
優點:
- 職責分離更徹底,高內聚低耦合。
- 更好的可測試性和可維護性。
2.5 整潔架構(2012)
Robert C. Martin(Uncle Bob)於2012年發表了整潔架構。這套架構是站在巨人的肩膀上,把MVC、EBI、端口適配器、洋蔥架構、DDD融會貫通,形成了一套落地實踐方案。
- Enterprise Business Rules 企業級業務規則層:核心業務內聚(對應DDD的領域服務+領域實體)。
- Application Business Rules 應用級業務規則層:應用層業務編排。
- Interface Adapters 接口適配層:數據轉化。
- Frameworks & Drivers 框架和驅動層:底層實現和數據庫等驅動。
Robert C. Martin有一份落地細節圖,如下:
核心:
- 前端(左邊)就是MVPVM架構(MVC的一種最貼合現代的延伸架構)
- 後端(右邊)是EBI架構(Entity-Boundary-Interactor)
優點:
- 它告訴我們如何把所有的概念、規則和模式整合起來,形成一種標準實現套路。
三、總結
縱觀EBI架構、DDD領域驅動設計、端口適配器架構、洋蔥架構、整潔架構。完全沒有衝突,就是領域設計的完美落地歷史。一張圖歸納之:
==========參考===============
//www.jianshu.com/p/d3e8b9ac097b
2008 – Jeffrey Palermo – The Onion Architecture: part 1
2008 – Jeffrey Palermo – The Onion Architecture: part 2
2008 – Jeffrey Palermo – The Onion Architecture: part 3
2013 – Jeffrey Palermo – The Onion Architecture: part 4 – After Four Years
//blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html