---
# System prepended metadata

title: Dependency Injection 與 Service Locator 選擇
tags: [程式]

---

### 依賴注入 Dependency Injection
1. 以 建構子注入、方法注入、屬性注入
    * 建構子注入 : 使本身建構子需要傳入更多的參數
    * 方法注入 : 需要另外呼叫
    * 屬性注入 : 容易有null產生
2. 注入位置較明確，尤其以建構子注入
3. 僅提供介面來注入，可以不用具體認識與依賴外部注入器
4. 較偏向靜態設置，由外部決定注入哪些元件

### 服務定位器 Service Locator
1. 由用戶主動去呼叫並請求服務
2. 可於任意處呼叫取用服務，方便直觀但較容易有忽略未注意的可能
3. 需直接具體認識並依賴服務定位器
4. 可動態與靜態配置，由內部決定取用哪些元件

### 個人偏好
不使用依賴注入框架，但在可替換的元件上採用依賴注入的方式。
在取用偏向於服務/工具、不常替換的的外部元件時，使用服務定位器。


### 參考資料
* [Dependency Injection是什麼？](https://zxuanhong.medium.com/dependency-injection%E6%98%AF%E4%BB%80%E9%BA%BC-ae83f7f87d6d)
* [\[轉載\] IoC 容器和 Dependency Injection 模式](https://garyliutw.blogspot.com/2013/06/ioc-dependency-injection_27.html)([原文](https://martinfowler.com/articles/injection.html))