關於本書
本書內容是關於 .NET 相依性注入(Dependency Injection,簡稱 DI)程式設計的相關議題。透過本書,您將會了解:
- 什麼是 DI、它有什麼優點、何時使用 DI、以及可能碰到的陷阱。
- 如何運用 DI 應付容易變動的軟體需求,設計出更彈性、更好維護的程式碼。
- 與 DI 有關的設計模式。
- DI 於 .NET 應用程式中的實務應用(如 ASP.NET MVC、ASP.NET WEB API、WCF 等等)。
- 如何在應用程式中使用現成的 DI 框架來協助實現 DI。本書支援的 DI 框架主要是 Unity,部分章節有提供 Autofac 的範例(如第 5 章、第 6 章)。
誰適合閱讀本書
這不是 .NET 程式設計的入門書。以下是閱讀本書的基本條件:
- 熟悉 C# 語法,包括擴充方法(extrension methods)、泛型(generics)、委派(delegates)等等。如果精通的是 VB(或其他 .NET 語言)但不排斥 C# 語法,也是 OK 的。
- 具備物件導向的基礎概念,知道何謂封裝、繼承、多型(polymorphism)。
倒不是說,不符合以上條件的讀者就無法從本書汲取有用的東西;只是就一般的情況而言,讀起來會比較辛苦一些。
如果您曾經接觸、研究過設計模式(design patterns),有些章節閱讀起來會輕鬆一些。然而這並非基本要求,因為本書也會一併介紹相關的設計模式與原則,例如 Decorator 模式、Factory 模式、開放/封閉原則(Open/Closed Principle)、單一責任原則(Single Responsibility Principle)等等。
此外,如果下列描述有一些符合您現在的想法,那麼本書也許對您有幫助:
- 我的日常開發工作需要設計共用的類別庫或框架,供他人使用。
- 我經常使用第三方(third-party)元件或框架,而且它們都提供了某種程度的 DI 機制。為了充分運用這些機制,我必須了解 DI 的各種用法。
- 我希望能夠寫出寬鬆耦合、容易維護的程式碼。
- 我已經開始運用寬鬆耦合的設計原則來寫程式,我想知道更多有關 DI 的細節,以了解有哪些陷阱和迷思,避免設計時犯了同樣的毛病。
- 我正在開發 ASP.NET MVC 或 ASP.NET Web API 應用程式,想要了解如何運用 DI 技術來改善我的應用程式架構。
無論如何,自己讀過的感覺最準。建議您先讀完本書的試閱章節(包含本書第 1 章完整內容),以評估這本書是否適合你。
如何閱讀本書
您並不需要仔細讀完整本書才能得到你需要的 DI 觀念與實務技巧。如果不趕時間,我的建議是按本書的章節順序仔細讀完「基礎篇」(一至三章)。讀完前面三章,掌握了相關基礎概念和常用術語之後,接下來的「實戰篇」與「工具篇」,則可依自己的興趣來決定閱讀順序。
舉例來說,如果你希望能夠盡快學會使用 Unity 框架的各項功能,則可嘗試在讀過第一和第二章以後,直接跳到「工具篇」。等到將 DI 技術實際應用於日常開發工作時,便可能會需要知道如何運用 .NET Framework 提供的 DI 機制,屆時本書「實戰篇」的內容也許就有你需要的東西。
在撰寫第七章〈Unity 學習手冊〉時,我大多採取碰撞式寫法,讓一個主題帶出另一個主題。因此,即使是介紹 Unity 框架的用法 ,應該也能夠依序閱讀,而不至於像啃 API 參考文件那般枯燥。
無論使用哪一種方法來閱讀本書,有一項功課是絕對必要的,那就是:動手練習。碰到沒把握的範例程式或有任何疑惑時,最好都能開啟 Visual Studio,親手把程式碼敲進去,做點小實驗,學習效果肯定更好。
書寫慣例
技術書籍免不了夾雜一堆英文縮寫和不易翻譯成中文的術語,而且有些術語即使譯成中文也如隔靴搔癢,閱讀時反而會自動在腦袋裡轉成英文來理解。 因此,對於這些比較麻煩的術語,除了第一次出現時採取中英並呈,例如「服務定位器」(Service Locator),往後再碰到相同術語時,我傾向直接使用英文——這並非絕對,主要還是以降低閱讀阻力為優先考量。
書中不時會穿插一些與正文有關的補充資料,依不同性質,有的是以單純加框的側邊欄(sidebar)圈住,有的則會佐以不同的圖案。底下是書中常用的幾個圖案:
需要準備的工具
本書範例皆以 C# 寫成,使用的開發工具是 Visual Studio 2017。為了能夠一邊閱讀、一邊練習,您的 Windows 作業環境至少需要安裝下列軟體:
- .NET Framework 4.5
- Visual Studio 2015 Community 或 Professional 以上的版本
範例程式與補充資料
本書的完整範例程式與相關補充資料都放在 github 網站上。網址如下:
https://github.com/huanlin/di-book-support
版本更新紀錄
2018 年 9 月
- 第 6 章與第 7 章:針對 Unity 套件從 v3.x 升級至目前最新版本(v5.8.11)而修改一些過時的文字敘述和程式碼。主要是 Unity 相關組件以及 namespace 的名稱,以及少數的屬性與方法名稱。
- 第 7 章:補強 Unity 的〈攔截〉一節的內容。
- 第 7 章:範例程式專案的套件參考形式由 packages.config 改為使用 PackageReference。
2018 年 8 月
- 修正第 1 章:原「對開放擴充」,改為「對擴充開放」。
- 修正第 7 章與第 8 章錯誤(感謝 Allen Kuo 大大):
應為「以上兩個類別…」
- 更新範例原始碼,確保所有範例專案所參考的套件是最新版,且都能夠以 Visual Studio 2017 編譯(感謝 Allen Kuo 大大的提醒)。
2014 年 12 月
2014/12/8 正式發布初版。
2014 年 7 月
2014/7/7 首次對外發布 beta 版。