在每個系統中,總會有個元件負責建立、協調並啟動其他所有元件。
這個元件就是 Main。它是系統入口點(Entry Point)

雖然我們在整潔架構中強調依賴反轉(依賴抽象),但終須有人負責 new 具體物件。
這個「骯髒」的工作,就是 Main 的職責。

一、最終的細節 (The Ultimate Detail)#

Main 是系統中層級最低的元件。 這意味它距離輸入/輸出(I/O)最近,它是所有依賴關係的起點。

  • 最髒元件: Main 知道所有細節。它依賴於所有的工廠(Factories)、策略(Strategies)、資料庫驅動程式與 UI 框架
  • 不被依賴: 系統中沒任何東西依賴於 Main。它處於依賴鏈最邊緣

二、Main 的職責:建立與移交#

Main 的工作流程通常包含兩個階段:

  1. 建立與組裝 (Construction):
    • 建立所有的 Factory、Strategy 和其他全域設施
    • 將這些依賴注入(Dependency Injection)到高層級的抽象類別中
  2. 移交控制權 (Handover):
    • 一旦組裝完成,Main 就將控制權交給高層級的抽象元件(如 Application.run()
    • Main 就可以功成身退,系統開始依照定義好的架構運作

三、Main 作為外掛 (Main as a Plugin)#

我們可把 Main 視為應用程式的一個外掛(Plugin)
為什麼?因為 Main 是依賴於應用程式的高層策略,而不是反過來。

這帶來一個巨大好處:我們可以擁有多個 Main 元件。

  • MainDev: 用於開發環境。它可能會組裝 Mock 資料庫和簡單的 UI
  • MainTest: 用於測試環境。它會注入測試用的 Stub 和 Spy
  • MainProd: 用於生產環境。它會組裝真實的 Oracle 資料庫和複雜的 Web 框架

透過將 Main 視為外掛,原本棘手的「設定問題(Configuration Problem)」變得容易解決,
因我們可以針對不同環境,掛載不同的 Main 外掛。

Main 是架構邊界外的守門員。 它是我們將「依賴注入」這類骯髒細節隔離的地方,確保應用程式的其他部分可以保持整潔與抽象。