依賴注入:原理、實作與設計模式 封面

依賴注入:原理、實作與設計模式

👨‍💼: Steven van Deursen, Mark Seemann
📅: July 30, 2020
Buy Now
📖:
依賴注入領域最全面的參考書,從核心原理、模式與反模式目錄、Pure DI 實踐到 DI Container 比較,以 .NET 生態為範例系統性闡述鬆耦合軟體設計。
📘 深度概覽

作者背景#

Steven van Deursen 是 Simple Injector(一款注重安全性與正確性的 .NET DI Container)的創建者與維護者,擁有超過十五年的 .NET 平台軟體架構經驗。Mark Seemann 是丹麥軟體架構師與作家,本書第一版(2011 年)的原作者,同時也是《Code That Fits in Your Head》的作者,長期在部落格上撰寫關於函數式程式設計與軟體設計的深度文章。兩人在第二版中大幅重寫了全書內容,反映了 DI 社群十年來在 Pure DI、SOLID 原則與 Container 選擇上的認知演進。

完整摘要#

全書分為四大部分,共十五章,從概念建立到實務應用層層遞進。

第一部分「Putting DI on the Map」以電線插座的日常比喻開篇,定義 DI 的三個維度——物件組裝(Object Composition)、物件生命週期(Object Lifetime)與攔截(Interception)——並破除四個常見迷思。透過 Mary Rowan 電商應用程式的前後對比,生動展示緊耦合(inside-out 開發、依賴方向錯誤、無法測試)與鬆耦合(outside-in 開發、依賴反轉、Composition Root)的具體差異。Stable Dependencies 與 Volatile Dependencies 的區分為後續判斷何時該注入提供了清晰的決策標準。

第二部分「Catalog」是一份 DI 參考目錄。四種核心模式(Composition Root、Constructor Injection、Method Injection、Property Injection)各有明確的適用場景與決策樹,其中 Constructor Injection 是預設首選。四種反模式(Control Freak、Service Locator、Ambient Context、Constrained Construction)揭示了隱藏依賴關係與降低可測試性的常見陷阱。三種程式碼異味(Constructor Over-injection、Abuse of Abstract Factories、Cyclic Dependencies)則指出這些問題往往不是 DI 本身的缺陷,而是底層設計違反 SRP 等原則的信號。

第三部分「Pure DI」是全書的核心實踐篇,展示如何不使用任何 DI Container,僅靠手動組裝實現完整的 DI。以「Mise en place」烹飪比喻開篇,說明先準備好所有元件、最後一刻才組裝的理念。透過 Console、UWP 與 ASP.NET Core MVC 三種框架示範 Composition Root 的位置選擇。生命週期管理一章深入 Singleton、Transient 與 Scoped 三種模式,特別警告 Captive Dependencies 的配置錯誤。Interception 以 Decorator Pattern 為核心,展示如何在不修改既有程式碼的前提下加入稽核、斷路器、授權等橫切功能。SOLID 驅動的 AOP 一章將寬介面重構為泛型 Abstraction(如 ICommandHandler<TCommand>),實現「一次實作,全面套用」。

第四部分「DI Containers」客觀比較 Autofac、Simple Injector 與 Microsoft.Extensions.DependencyInjection 三種容器,明確建議:當 Auto-Registration 能帶來顯著價值時使用容器,否則 Pure DI 已足夠。

本書的貢獻與定位#

本書將依賴注入從一種「框架功能」提升為「軟體設計原則」,其核心主張——Pure DI 優先於 Container——挑戰了業界長期以來對 DI Container 的過度依賴。書中建立的模式/反模式/異味三層分類體系,為開發者提供了系統化的設計決策框架。雖然範例以 .NET 為主,其設計原則(Composition Root、Volatile Dependencies 判斷、SOLID 驅動的 AOP)廣泛適用於任何物件導向語言,是軟體架構師在依賴管理領域的權威參考。