在每個系統中,總會有個元件負責建立、協調並啟動其他所有元件。
這個元件就是 Main。它是系統入口點(Entry Point)。
雖然我們在整潔架構中強調依賴反轉(依賴抽象),但終須有人負責 new 具體物件。
這個「骯髒」的工作,就是 Main 的職責。
一、最終的細節 (The Ultimate Detail)#
Main 是系統中層級最低的元件。 這意味它距離輸入/輸出(I/O)最近,它是所有依賴關係的起點。
- 最髒元件: Main 知道所有細節。它依賴於所有的工廠(Factories)、策略(Strategies)、資料庫驅動程式與 UI 框架
- 不被依賴: 系統中沒任何東西依賴於 Main。它處於依賴鏈最邊緣
二、Main 的職責:建立與移交#
Main 的工作流程通常包含兩個階段:
- 建立與組裝 (Construction):
- 建立所有的 Factory、Strategy 和其他全域設施
- 將這些依賴注入(Dependency Injection)到高層級的抽象類別中
- 移交控制權 (Handover):
- 一旦組裝完成,Main 就將控制權交給高層級的抽象元件(如
Application.run()) - Main 就可以功成身退,系統開始依照定義好的架構運作
- 一旦組裝完成,Main 就將控制權交給高層級的抽象元件(如
三、Main 作為外掛 (Main as a Plugin)#
我們可把 Main 視為應用程式的一個外掛(Plugin)。
為什麼?因為 Main 是依賴於應用程式的高層策略,而不是反過來。
這帶來一個巨大好處:我們可以擁有多個 Main 元件。
- MainDev: 用於開發環境。它可能會組裝 Mock 資料庫和簡單的 UI
- MainTest: 用於測試環境。它會注入測試用的 Stub 和 Spy
- MainProd: 用於生產環境。它會組裝真實的 Oracle 資料庫和複雜的 Web 框架
透過將 Main 視為外掛,原本棘手的「設定問題(Configuration Problem)」變得容易解決,
因我們可以針對不同環境,掛載不同的 Main 外掛。
Main 是架構邊界外的守門員。 它是我們將「依賴注入」這類骯髒細節隔離的地方,確保應用程式的其他部分可以保持整潔與抽象。