書 名:.NET 依賴注入
頁 數:235
格 式:PDF、EPUB、MOBI
難易度:中階至進階
出版日期:2014 年 12 月 8 日
ISBN:9789574320684
簡介
本書內容是關於 .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 章)。
本書的范例皆以 C# 撰寫,讀者無須具備任何 DI 背景知識。
【點我下載樣章】
如何購買
您可以至下列平台購買(都有樣章可以免費下載試閱):
- Leanpub: https://leanpub.com/dinet-s (建議採用! 先注冊一個使用者賬號,然后利用此賬號來買書)
請注意:注冊賬號時填寫的 e-mail 必須是有效的!這很重要,因為往后的書籍更新通知訊息都會發送到這個 e-mail 地址。 - Pubu:http://goo.gl/orzQRJ (中文用戶介面,support both online reading and download PDF/EPUB)
- SelfStore:https://selfstore.io/products/247 (功能比較陽春,好處是中文用戶介面)
購書時,您可在網頁上自行調整價格滑動桿,以本書的最低價格結賬。當然,如果您要給予作者更多鼓勵,也可以直接用建議售價或更高的價錢來購買。
更新通知
訂購此書時,只要有輸入 e-mail 地址,將來有新版本發布時,您就會收到更新通知和下載連結。
Table of Content
序
關於本書
誰適合閱讀本書
如何閱讀本書
書寫慣例
需要准備的工具
更新與支持
范例程序與補充材料
致謝
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
使用自動工廠
注入自定義工廠
對象生命周期管理
默認的生命周期
指定生命周期
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 來處理晚期綁定
附錄二:初探 ASP.NET 5 的自帶 DI 容器
練習步驟
步驟 1:建立項目
步驟 2:加入必要組件
步驟 3:將 Web API 組件加入 ASP.NET 管線
步驟 4:加入 API Controller
步驟 5:編寫測試用的服務類型
步驟 6:注入相依對象至 Controller 的構造函數
結語
下載范例程式與補充資料
本書的完整范例程式與相關補充資料都放在 github 網站上。網址如下:
https://github.com/huanlin/di-book-support
意見反饋
如有任何疑問或建議,歡迎在此留言指教,或與作者本人聯系。謝謝~
