在實際專案中,大家是否曾注意到許多類別的建構子會呼叫其他類別作為參數,但在實際使用該類別時卻沒有傳入這些參數呢?在前兩章中,我們已經介紹了 SOLID 原則中的依賴反轉原則。這次,我們將進一步探討控制反轉與依賴注入的概念。
控制反轉是一種設計原則,將物件的控制權轉移給第三方容器(IoC 容器)。
在依賴反轉原則中,我們已經讓物件共同依賴於抽象而非具體實例。然而,如果流程運作中只是單純依序處理物件,那麼當流程改變時,實例也需要相應地調整,這樣並沒有完全解決高耦合的問題。在這種情況下,就需要利用控制反轉。舉例來說:
假設你有一個三角形與一個長方形物件,你在流程中依序計算它們的周長。當需要加入五邊形時,你除了創建五邊形物件,還需要將其加入計算流程,才能得到最終的答案。
使用控制反轉時,你可以額外創建一個 IoC 容器,在容器中執行計算周長的函數和其他功能。這樣當我們需要五邊形時,只需創建五邊形物件,並將其放入 IoC 容器中,就能獲得答案。
總結一下控制反轉的特點:
如果說控制反轉是一種理念,那麼依賴注入就是實現這個理念的具體方式。
依賴注入可以根據注入的時機分為三種方式:建構元注入、設值方法注入以及介面注入。根據注入的生命週期,又可以分為 Transient(一次性)、Scoped(作用域)與 Singleton(單例)。
以 Laravel 框架為例,由於可以直接在 AppServiceProvider
類別中使用 register
方法,最常使用的方式通常是將 Singleton 與建構元注入搭配使用,也就是我們一開始引言中提到的注入方式喔!