[書訊] .NET 相依性注入 (2014-12-08 更新)

電子書開始動工已經出版....


書  名:.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 背景知識。

本書目錄

序
    關於本書
    誰適合閱讀本書
    如何閱讀本書
    書寫慣例
    需要準備的工具
    更新與支援
        下載範例程式與補充資料
    致謝
Part I:基礎篇
    第 1 章:導論
        為什麼需要 DI?
            可維護性
            寬鬆耦合
            可測試性
            平行開發
        什麼是 DI?
            入門範例—非 DI 版本
            入門範例—DI 版本
        何時該用 DI?
    第 2 章:DI 用法與模式
        設計模式梗概
            小引-電器與介面
            Null Object 模式
            Decorator 模式
            Composite 模式
            Adapter 模式
            Factory 模式
        注入方式
            建構式注入
            屬性注入
            方法注入
        Ambient Context 模式
            已知應用例
            範例程式(一)
            範例程式(二)
        Service Locator 模式
        過猶不及-再談建構式注入
            半吊子注入
            過度注入
    第 3 章:DI 容器
        DI 容器簡介
            物件組合
        自製 DI 容器
            自製 DI 容器—2.0 版
            現成的 DI 容器
        物件組合
            使用 XML
            使用程式碼
            自動註冊
            自動匹配
            深層解析
        物件生命週期管理
            記憶體洩漏問題
            生命週期選項
        攔截
            使用 Decorator 模式實現攔截
Part II:實戰篇
    第 4 章:DI 與 ASP.NET MVC 分層架構
        分層架構概述
            Repository 模式
        MVC 分層架構範例 V1-緊密耦合
            領域模型
            資料存取層
            應用程式層
            展現層
            檢視目前設計
        MVC 分層架構範例 V2-寬鬆耦合
            領域模型
            資料存取層
            應用程式層
            展現層
            組合物件
            檢視目前設計
            避免過度設計
        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 範例
            使用 DI 容器:Unity
            使用 DI 容器:Autofac
    第 6 章:更多 DI 實作範例
        共用程式碼
        DI 與 ASP.NET MVC 5
            練習:使用 Unity
        DI 與 ASP.NET Web Forms
            問題描述
            解法
            練習:使用 Unity
            練習:使用 Unity 的 BuildUp 方法
            練習:使用 Autofac
        DI 與 WCF
            問題描述
            解法
            練習:使用 Unity
            練習:使用 Autofac.Wcf 套件
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 或 Facade 來封裝 3rd-party 元件
        不要一律為每個元件定義一個介面
        對於同一層(layer)的元件,可依賴其具象型別
    動態解析
        盡量避免把 DI 容器直接當成 Service Locator 來使用
        考慮使用物件工廠或 Func 來處理晚期繫結
附錄二:初探 ASP.NET 5 的內建 DI 容器
    實作練習
        步驟 1:建立專案
        步驟 2:加入必要組件
        步驟 3:將 Web API 元件加入 ASP.NET 管線
        步驟 4:加入 API Controller
        步驟 5:撰寫測試用的服務類別
        步驟 6:注入相依物件至 Controller 的建構函式
    結語


閱讀體驗

PDF 的閱讀體驗肯定是三種格式中最好的,但若閱讀裝置的螢幕尺寸夠大的話,其實 EPUB 版本也不差(我外出搭車時就常看 EPUB 版本)。

底下是用電腦閱讀 PDF 檔的畫面截圖:


接著是我在平板上用 Google Books 閱讀本書 EPUB 格式的畫面截圖:




接下來兩張圖是翻拍我的 Kindle 畫面:




由於平板畫面比較小,有些比較複雜的程式碼仍會因為過多折行而增加閱讀的麻煩。一般的文字和圖片,目前看起來是還好,就是圖片仍嫌小了點。

試閱與購買

 您可以透過下列電子書平台試閱或購買本書:
  • Leanpub.com(PDF、EPUB、MOBI,可下載樣章
  • Google 圖書(PDF、EPUB)
  • Pubu (PDF、EPUB,可線上試閱 2015-03-30:由於 Pubu 處理 PDF 檔案有 bug,會造成某些 PDF 的 Table of Content 連結全部失效,故先從 Pubu 下架。

由於各平台的功能有一些差異,使得同一本書在不同書店的定價和閱讀體驗不太一致,這點還請讀者明察。基本上,Leanpub 的功能比較豐富,而 Pubu 與「Google 圖書」則提供了更多種付款方式,而且中文介面用起來更直觀。

關於 Leanpub 的詳細介紹,可參考這篇:如何購買《.NET 相依性注入》,以及購買之後的後續相關問題(例如退還)。

更新通知

每當本書有更新版本,除了利用電子書平台本身提供的郵件通知功能,我也會一併將更新訊息發布於 Facebook 粉絲專頁。故您也可以選擇加入或追蹤上述專頁,以便收到本書的最新訊息。

下載範例程式與補充資料

本書的完整範例程式與相關補充資料都放在 github 網站上。網址如下:
https://github.com/huanlin/di-book-support

25 則留言:

  1. 讀完第一章後, 迫不及待想看第二章了, 精彩好書, 讚!!!

    回覆刪除
  2. 謝謝 Ken! 我會加緊腳步 :)

    回覆刪除
  3. 可以請問一下,這書打算會有幾個章節呢??

    回覆刪除
  4. 第一版會是一本小書,目前預計至少五章喔。若將來打算納入 Unity 之外的 DI 容器,則每增加一個(例如 Ninject)就會多出一章。

    回覆刪除
  5. 讚!! 期待你的新書~

    回覆刪除
  6. 請問一下我已經買了,也已下載了,但是如果我要在不同電腦上下載呢??好像沒有任何認證機制來證明身份嗎??

    回覆刪除
  7. 您好! 我記得 leanpub 是沒有對電子書做 DRM 保護,所以我想應該是可以在別台電腦利用同一連結下載。或者,您也可以將先前已經下載的檔案複製到別台電腦上。

    回覆刪除
  8. 你好~請問一下!我剛剛已經買了,可是好像沒有什麼登入機制~所以之後如果有更新~要怎麼被通知及下載呢?謝謝~~ ^_^

    回覆刪除
  9. 已購! 支持好作者 :)
    不過 mobi 格式放到我的 kindle paperwhite 2 沒辦法被讀取到。

    回覆刪除
    回覆
    1. 抱歉回覆得晚些。我把好久沒用的 Kindle 拿出來充電之後,把這本電子書的 .mobi 檔案丟進去,可以讀耶!
      我把翻拍 Kindle 畫面的圖補在正文中了。我不太清楚 Kindle Paperwhite 2 的規格,照理說應該可以讀才對啊。
      我的是 Kindle Touch。

      刪除
  10. To 上上樓 Pajace:
    您在購買時,會有個 email 欄位,不知您有沒有填?有填的話,每次我發布更新版本時,您就會收到通知。
    萬一當時沒有填,也可以到此部落格的臉書專頁按讚:https://www.facebook.com/huanlin.notes 。每次有發布新版時,我都會在專頁和部落格發布消息,這樣您也就能收到通知了。

    回覆刪除
    回覆
    1. 有了~我剛剛登入 Leanpub 可以設定 email . 謝謝~~
      Leanpub 還有可以管理買過的電子書~好方便耶~
      謝謝老師的提醒

      刪除
  11. To IT Player:
    感謝支持!Kindle 格式我還沒試,我待會看一下喔....

    回覆刪除
  12. 作者已經移除這則留言。

    回覆刪除
  13. 感謝回應,我昨天把他放到 calibre裡面再拿出來。就可以用了。
    好像是跟 DRM 有關係

    回覆刪除
  14. 還好有法可解。多謝告知 ^^

    回覆刪除
  15. Hi 煥麟大哥,相關討論在這邊。
    http://blog.the-ebook-reader.com/2013/01/25/how-to-remove-drm-from-kindle-ebooks-in-4-easy-steps/

    只是比較神奇的事情是...書從 LeanPub 來,怎麼也會有 drm 的問題。這就是我也還沒解的謎。
    目前可以看書就好了。
    謝謝您高品質的著作。

    回覆刪除
  16. 蔡老師您好,我發現有個地方怪怪的,疑似筆誤提供給您參考
    第37頁下方的例子
    var t1 = new Thread(ShowTime);
    var t2 = new Thread(ShowTime);

    t1.Start();
    System.Threading.Thread.Sleep(2000);
    t1.Start(); <= 這裡會卡住,要改成 t2 才能順利執行
    System.Threading.Thread.Sleep(2000);

    ShowTime();

    回覆刪除
  17. Hi Pajace,
    您的理解沒錯,那一行程式碼是我當初寫稿時筆誤了。我剛剛發布了新的修正版本,但因為只是細微修訂,就沒有發送通知郵件給全部讀者。您只要登入 leanpub 帳戶重新下載電子書,便可獲取修正版。
    感謝您的細心與指正 ^_^

    回覆刪除
  18. 真是一本好書,讓我忍不到11/29的5折價,就手一抖給買了,期待老師後續的大作

    回覆刪除
    回覆
    1. 謝謝小德! 希望到時候很多人的手都會不小心抖了一下 ^_^

      刪除

技術提供:Blogger.
回頂端⬆️