本書內容大綱

序
    關於本書
    誰適合閱讀本書
    如何閱讀本書
    書寫慣例
    需要準備的工具
    更新與支援
        範例程式與補充資料
    致謝
Part I:基礎篇
    第 1 章:導論
        為什麼需要 DI?
            可維護性
            寬鬆耦合
            可測試性
            平行開發
        什麼是 DI?
            入門範例—非 DI 版本
            入門範例—DI 版本
                提煉介面(Extract Interface)
                控制反轉(IoC)
        何時該用 DI?
        本章回顧
    第 2 章:DI 用法與模式
        設計模式梗概
            小引-電器與介面
            Null Object 模式
            Decorator 模式
            Composite 模式
            Adapter 模式
            Factory 模式
        注入方式
            建構式注入
                已知應用例
                用法
                範例程式
            屬性注入
                已知應用例
                用法
                範例程式
            方法注入
                已知應用例
                用法
                範例
        Ambient Context 模式
            已知應用例
            範例程式(一)
            範例程式(二)
        Service Locator 模式
        過猶不及-再談建構式注入
            半吊子注入
                阻止相依蔓延
                解決「半吊子注入」
            過度注入
                重構成參數物件
                多載建構函式
                重構成 Façade 模式
        本章回顧
    第 3 章:DI 容器
        DI 容器簡介
            物件組合
        自製 DI 容器
            自製 DI 容器—2.0 版
            現成的 DI 容器
        物件組合
            使用 XML
            使用程式碼
            自動註冊
            自動匹配
            深層解析
        物件生命週期管理
            記憶體洩漏問題
            生命週期選項
        攔截
            使用 Decorator 模式實現攔截
        本章回顧
Part II:實戰篇
    第 4 章:DI 與 ASP.NET MVC 分層架構
        分層架構概述
            Repository 模式
        MVC 分層架構範例 V1-緊密耦合
            領域模型
            資料存取層
            應用程式層
            展現層
            檢視目前設計
        MVC 分層架構範例 V2-寬鬆耦合
            領域模型
            資料存取層
            應用程式層
            展現層
            組合物件
                切換 Controller 工廠
            檢視目前設計
            避免過度設計
        MVC 分層架構範例 V3-簡化一些
            資料存取層
            應用程式層
            展現層
            檢視目前設計
            一個 HTTP 請求搭配一個 DbContext
        ASP.NET MVC 5 的 IDependencyResolver
            實作自訂的 IDependencyResolver 元件
        本章回顧
    第 5 章:DI 與 ASP.NET Web API
        ASP.NET Web API 管線
            Controller 是怎樣建成的?
            注入物件至 Web API Controller
        抽換 IHttpControllerActivator 服務
            純手工打造
            使用 DI 容器:Unity
        抽換 IDependencyResolver 服務
            IDependencyResolver 與 IDependencyScope
            純手工 DI 範例
                步驟 1:實作 IDependencyResolver 介面
                步驟 2:替換預設的型別解析器
            使用 DI 容器:Unity
            使用 DI 容器:Autofac
        本章回顧
    第 6 章:更多 DI 實作範例
        共用程式碼
        DI 與 ASP.NET MVC 5
            練習:使用 Unity
                Step 1:建立新專案
                Step 2:設定 Unity 容器
                Step 3:建立 Controller
        DI 與 ASP.NET Web Forms
            問題描述
            解法
            練習:使用 Unity
                Step 1:建立新專案
                Step 2:註冊型別
                Step 3:撰寫 HTTP Handler
                Step 4:註冊 HTTP Handler
                Step 5:撰寫測試頁面
            練習:使用 Unity 的 BuildUp 方法
            練習:使用 Autofac
                Step 1:建立新專案
                Step 2:註冊型別
                Step 3:撰寫 HTTP Handler
                Step 4:註冊 HTTP Handler
                Step 5:撰寫測試頁面
        DI 與 WCF
            問題描述
            解法
            練習:使用 Unity
                Step 1:建立 WCF 服務
                Step 2:撰寫自訂的 ServiceHostFactory
                Step 3:撰寫自訂的 ServiceHost
                Step 4:實作 IContractBehavior 介面
                Step 5:實作 IInstanceProvider 介面
                Step 6:設定 Unity 容器
                Step 7:修改 Web.config
                Step 8:撰寫用戶端程式
            練習:使用 Autofac.Wcf 套件
                Step 1:建立 WCF 服務
                Step 2:撰寫自訂的 ServiceHostFactory
                Step 3:設定 Autofac 容器
                Step 4:修改 Web.config
                Step 5:撰寫用戶端程式
        本章回顧
Part III:工具篇
    第 7 章:Unity 學習手冊
        Unity 快速入門
            Hello, Unity!
            註冊型別對應
            註冊既有物件
            解析
                解析一個物件:Resolve
                具名註冊與解析
                解析多個物件:ResolveAll
            註冊與解析泛型
            檢查註冊
            使用組態檔來設定容器
                Unity 組態檔基本格式
                載入組態檔設定
        註冊與解析-進階篇
            共用的範例程式
                情境
                設計
                程式碼
            自動註冊
                解決重複型別對應的問題
                AllClasses 類別
                WithMappings 類別
            自動匹配
                自動匹配規則
            手動匹配
                循環參考問題
            注入參數
            注入屬性
            延遲解析
                使用 Lazy<T>
                使用自動工廠
            注入自訂工廠
        物件生命週期管理
            預設的生命週期
            指定生命週期
                Transient vs. Per-Resolve
                Per-Request 生命週期
            階層式容器
            選擇生命週期管理員
        攔截
            使用 Unity 容器實現攔截
                Step 1:加入 Unity 的攔截擴充套件
                Step 2:實作攔截行為
                Step 3:註冊攔截行為
        結語
附錄一:DI 容器實務建議
    容器設定
        避免對同一個組件(DLL)重複掃描兩次或更多次
        使用不同類別來註冊不同用途的元件
        使用非靜態類別來建立與設定 DI 容器
        不要另外建立一個 DLL 專案來集中處理相依關係的解析
        為個別組件加入一個初始化類別來設定相依關係
        掃描組件時,盡量避免指定組件名稱
    生命週期管理
        優先使用 DI 容器來管理物件的生命週期
        考慮使用子容器來管理 Per-Request 類型的物件
        在適當時機呼叫容器的 Dispose 方法
    元件設計相關建議
        避免建立深層的巢狀物件
        考慮使用泛型來封裝抽象概念
        考慮使用 Adapter 或 Façade 來封裝 3rd-party 元件
        不要一律為每個元件定義一個介面
        對於同一層(layer)的元件,可依賴其具象型別
    動態解析
        盡量避免把 DI 容器直接當成 Service Locator 來使用
        考慮使用物件工廠或 Func<T> 來處理晚期繫結
附錄二:初探 ASP.NET 5 的內建 DI 容器
    練習步驟
        步驟 1:建立專案
        步驟 2:加入必要組件
        步驟 3:將 Web API 元件加入 ASP.NET 管線
        步驟 4:加入 API Controller
        步驟 5:撰寫測試用的服務類別
        步驟 6:注入相依物件至 Controller 的建構函式
    結語
 
 
The End