oea 是一個基于 ddd 思想的架構。在 oea 中,使用了 service、controller 來組織過程式邏輯。結構如下圖:

對于大型系統來說,oea 中的 service 主要作為分布式調用、本地調用的 facade 接口,主要的業務過程則使用 controller 來編寫。對于小型系統來說,則可以直接把業務過程邏輯都編寫在 service 中。
在設計 controller 時,應該特别注意兩點:
* 擴充點:controller 中表達業務過程行為的過程式方法,可以被擴充。這種擴充不應該改動調用方的代碼。
* 單向依賴:controller 之間應該是單向依賴的。否則,将會造成業務邏輯混亂。
我以最近編寫的一個倉庫管理産品的類圖,來說明如何設計,能更好地達到以上兩點:
該倉庫管理産品的業務邏輯使用 controller 組織。在編寫完成産品後,可以編寫擴充程式集,為産品主幹程式集中的業務邏輯編寫擴充。
client:主幹程式集中的用戶端程式,它調用服務完成分布式調用邏輯。
service:主幹程式集中的服務程式,它調用工廠建立 receivecontroller 來間接完成入庫邏輯。
receivecontroller:主幹程式集中的入庫業務控制器,它會組織入庫相關的各個領域模型(如倉庫、貨品等),來完成相關業務。
receivecontrollerext:擴充程式集中的入庫業務控制器。它繼承自主幹程式集中的 receivecontroller,并重寫了基中的 receive 方法,提供了新的入庫業務邏輯。
movecontroller:主幹程式集中的移庫業務控制器。它依賴入庫控制器,需要在入庫業務控制器中貨品到達後,執行它指定的移庫邏輯。入庫控制器不能依賴移庫控制器,這樣,某些場景下,就可以把移庫控制器去除,以達到簡單入庫、不執行移庫邏輯的目的。
oea.controller: 架構提供的控制器基類,“層基類模式”。
oea.controllerfactory:架構提供的控制器工廠。使用工廠模式封裝了所有業務控制器的構造過程,提供以下功能:
1. 具體控制器的建立。
建立具體子類的控制器,而不需要修改調用方代碼。例如:當 service 指定構造 receivecontroller 時,如果已經加載了 receivecontrollerext 類型擴充,則 controllerfactory 會傳回 receivecontrollerext 類型的執行個體,使得執行被擴充後的業務邏輯。
2. 控制器事件的自動挂接。
控制器聲明所依賴的其它控制器,架構會自動調用其相關的挂接程式。例如:movecontroller 依賴 receivecontroller,并使用 controllerfactory 中的方法來聲明需要監聽 receivecontroller 中的 received 事件。則 controllerfactory 在建立 receivecontroller 時,也會建立一個 movecontroller 的執行個體,并使其挂接到 receivecontroller.received 事件上。這樣就不需要改動 receivecontroller 的代碼。
其實,整個設計主要是使用“簡單工廠模式”來封裝了業務控制器的構造過程,而達到擴充的效果。
--------------------------------
附,使用此方案後,整個倉庫系統中 controller 的重構成果如下。解耦前:
解耦後:
簡化圖,解耦前: