Brian的雜記
  • Introduction
  • Brian's 雜記
    • My Awesome API
    • FB 大頭貼
    • 硬體雜記
    • PHP
    • project
      • 模擬器
      • WAMP
    • WinMerge
    • 雜記
      • LINQ
      • 方法
      • Grid View
      • namespace
      • global
      • 物件導向
      • Excel
      • VS2017
      • single sign on
      • Master
      • Https
      • 憑證
      • 略過憑證不符
      • NLog
      • 團隊開發
      • .NET Core
      • 共用網路上的芳鄰
      • 爬蟲
      • NPOI
      • RSS
      • 多執行緒
      • 記憶體回收
      • 密碼學
        • BCrypt
        • AES
      • 主機環境建置
      • Session
      • Error
      • IIS 相關
      • 無障礙相關
      • 介面
        • 影像地圖
      • telnet
        • smtp
      • nslookup
      • 協助客戶解決問題
      • 驗證欄位
      • 網站管理
      • 工具整理
    • 正規表示法
    • 影像處理
    • IntelliJ Idea
    • 觀念
      • Clean Code
        • 命名
        • 函式
        • 註解
        • 編排
        • 物件及資料結構
        • 錯誤處理
        • 邊界
        • 單元測試
        • 類別
      • Java 程式風格
      • Design Pattern
        • 單例模式
      • 同步
      • 畫圖
        • ER-Model
        • 類別圖
        • Use Case
        • 有限狀態機
      • 資料 API 文件 分析
      • CORS & SSL
      • 利用DISC幫助溝通
      • OAS
    • 檔案上傳
      • FileStore
      • App Engine
      • Google Storage
    • OAuth vs Open ID
    • MIME
    • 虛擬桌面
    • 待看資料
    • Selenium
    • CDN
    • HTTP
    • 編碼
    • 2nd-ML100Days
      • jupyter
    • 微服務
      • 設計
        • 1 ~ 5
        • 6
        • 7
        • 8
        • 9
    • Gradle
    • Maven
    • Error
    • 批次檔 BAT
    • Kurento
    • WebSocket & WebRTC
  • 需求面能力
    • User Story
  • Google Cloud Platform
    • Compute Engine
  • Python
    • 基本語法
    • Pandas
    • 套件
    • Matplotlib
    • Encoder
    • jupyter
  • Java
    • Java
      • File
      • Exception
      • 物件導向觀念
      • 加密
      • HTTP
      • 集合
      • Stream()
      • Web
      • ResultSet
      • JDK6
      • JDK8
    • 讀取、複寫MP3 Tag
    • Log4j2
    • Servlet
      • 容器
    • JSP
    • JBOSS
    • JWT
    • PreparedStatement
    • Error
    • Spring
      • Spring Boot
        • @Value
        • Build
      • RequestParameter
      • Error
      • Autowired
      • JPA
      • FeignClient
      • WebSocket
      • thymeleaf
      • Security
      • Test
      • Scheduled
      • Redirect
    • IntelliJ
  • Linux
    • Linux
    • Shell Script
    • Cygwin(在Windows執行Linux指令)
  • 前端
    • HTML
      • Link
    • CSS
      • Position
      • padding color
      • display
    • JS
      • jQuery
        • Select2
      • fancybox
      • ES6
      • 效能
      • GoogleMap API
        • Marker
        • InfoWindow
      • 事件
      • CKEditor
      • TGOS
      • JSON
      • QRcode
      • 核心概念
        • 物件 變數 型別
          • number
          • String
          • boolean
          • null & undefined
          • Symbol
        • JS 物件概念
        • 深入理解JS 函式物件
        • 更多ES2015/ES6 全新語言特性
      • Promise
    • 效果應用
  • 資料庫
    • 注意事項
    • MariaDB
    • MySQL
      • inner join 和 join
      • 字串比對
      • 倒數資料
    • SQL
      • DDL 資料定義語言
      • DML 資料操縱語言
      • DCL 資料控制語言
      • TCL 交易控制語言
      • T-SQL
      • CTE
      • JOIN
    • Oracle
    • MSSQL 操作
      • 新增使用者
      • SQL 指令
      • Sequence
    • 差異比較
    • MyBatis
    • Workbench 操作
    • SQL Injection
  • 版本控制
    • Gitlab
      • sign up
      • sign in
      • add project
      • add members
    • SourceGit
      • install
    • SmartGit
      • install
      • operate
      • git 操作雜記
    • TortoiseGit
    • Git
    • TFS
    • SVN
  • Test
    • 軟體測試原則
    • 演算法
    • XMind
      • install
    • Jenkins
      • 建置
    • HTTPie
    • Postman
    • 測試驅動開發
    • 撰寫測試的觀念
    • 測試框架
    • IoC & DI
    • 隔絕相依性的方式
    • JUnit
    • NUnit
    • 習慣
    • 虛設常式
  • Angular
    • hello world
    • ng-options
    • ES6
    • Build & Conponect
    • HttpClient
    • 部署
  • ASP.NET Web Form
    • Chapter 2
      • 2-1
        • 小東西
    • 略過請求驗證
  • Go
Powered by GitBook
On this page
  • Dependency Injection 依賴注入 (DI)
  • 如何向五歲的孩童解釋 DI?
  • 物件導向設計原則
  • Inversion of Control 控制反轉(IoC)
  • Dependency Injection 依賴注入 (DI)
  • 介面導向設計
  • 這個把初始化動作,由原本目標物件內,轉移到目標物件之外,稱作「控制反轉」,也就是 IoC。
  • 這個把依賴的物件,透過目標物件公開建構式,交給外部來決定,稱作「依賴注入」,也就是 DI。
  • 而 IoC 跟 DI,其實就是同一件事:讓外部決定目標物件的相依物件。

Was this helpful?

  1. Test

IoC & DI

Previous測試框架Next隔絕相依性的方式

Last updated 5 years ago

Was this helpful?

Dependency Injection 依賴注入 (DI)

參考資料:Dependency Injection 筆記()

如何向五歲的孩童解釋 DI?

該帖的問題是:「如何向五歲的孩童解釋 DI?」在眾多回答中,有位名叫 John Munch 的仁兄假設提問者就是那五歲的孩童而給了如下答案:

當你自己去開冰箱拿東西時,很可能會闖禍。
你可能忘了關冰箱門、可能會拿了爸媽不想讓你碰的東西,
甚至冰箱裡根本沒有你想要找的食物,又或者它們早已過了保存期限。
你應該把自己需要的東西說出來就好,
例如:「我想要一些可以搭配午餐的飲料。」
然後,當你坐下用餐時,我們會準備好這些東西。

物件導向設計原則

SRP(Single Responsibility Principle):單一責任原則。一個類別應該只有一個責任。

OCP(Open/Closed Principle):開放/封閉原則。對開放擴充,對修改封閉。

LSP(Liskov Substitution Principle):里氏替換原則。物件應該要可以被它的子類別的物件替換,且完全不影響程式的既有行為。

ISP(Interface Segregation Principle):介面隔離原則。多個規格明確的小介面要比一個包山包海的大型介面好。

DIP(Dependency Inversion Principle):相依反轉原則。依賴抽象型別,而不是具象型別。

Inversion of Control 控制反轉(IoC)

一般的做法: 上層呼叫某個高階模組的方法,該方法 new 一個低階模組的物件出來用。 這樣這個方法就會綁定這個物件。

但如果有多種類似的物件呢?

利用 介面(interface) 來解耦,將這些類別抽象化(共通的部分抽出來,做成介面),使這些共通性成為規格,而那些物件再實作這個介面、實作這些規格。

DIP: 高階模組不應依賴低階模組,它們應該去相依抽象層。 抽象層不應依賴實作細節,而是實作細節去依賴抽象層。

之後在使用時,由於不能new 出介面,那麼物件從何而來? 答案是由上方 new 出想要的物件,傳到該方法去讓底部使用。

原本在底部 new 物件出來,改成了從上層傳物件到底部去用,所以控制反轉了。

Dependency Injection 依賴注入 (DI)

一種設計模式和原則,用來寬鬆耦合。

以上方舉例來說,由呼叫端將相依物件透過建構函式,注入至另一個物件的作法,是DI的一種常見寫法,叫作「建構式注入」(Constructor Injection)。

DI的三種注入方式: 1.建構式注入(Constructor Injection) 2.屬性注入(Property Injection) 3.方法注入(Method Injection)

Note: 每當需要注入相依物件時,一般建議優先考慮「建構式注入」,因為其用法對呼叫端來說相當明確、直覺——建立物件時就要一併傳入所有相依物件,所以呼叫端透過建構函式便可得知某物件相依於哪些第三方元件。

介面導向設計

原本相依的物件,現在都透過相依於介面。

當要測試時,再從外部將實作介面的測試物件傳入,去驗證其商業邏輯。

這個把初始化動作,由原本目標物件內,轉移到目標物件之外,稱作「控制反轉」,也就是 IoC。

這個把依賴的物件,透過目標物件公開建構式,交給外部來決定,稱作「依賴注入」,也就是 DI。

而 IoC 跟 DI,其實就是同一件事:讓外部決定目標物件的相依物件。

而這個介面,也可以是目標物件的擴充點,或是接縫。

https://www.huanlintalk.com/post/2011-10-14-dependency-injection-1/