主元件 (The Main Component)#
在每一個系統中,總會有一個元件負責建立、協調並啟動其他所有元件。這個元件就是 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 是架構邊界之外的守門員。 它是我們將「依賴注入」這類骯髒細節隔離的地方,確保應用程式的其他部分可以保持整潔與抽象。