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