作為開發(fā)者,我們一直在嘗試通過使用設(shè)計(jì)模式和嘗試新的健壯型框架來尋找新的方式來編寫設(shè)計(jì)良好且健壯的代碼。在本篇文章中,我們將通過 Laravel 的 IoC 組件探索依賴注入設(shè)計(jì)模式,并了解它如何改進(jìn)我們的設(shè)計(jì)。
依賴注入
依賴注入一詞是由 Martin Fowler 提出的術(shù)語,它是將組件注入到應(yīng)用程序中的一種行為。就像 Ward Cunningham 說的:
依賴注入是敏捷架構(gòu)中關(guān)鍵元素。
讓我們看一個(gè)例子:
class UserProvider{ protected $connection; public function __construct(){ $this->connection = new Connection; } public function retrieveByCredentials( array $credentials ){ $user = $this->connection ->where( 'email', $credentials['email']) ->where( 'password', $credentials['password']) ->first(); return $user; } }
如果你要測(cè)試或者維護(hù)這個(gè)類,你必須訪問數(shù)據(jù)庫的實(shí)例來進(jìn)行一些查詢。為了避免必須這樣做,你可以將此類與其他類進(jìn)行 解耦 ,你有三個(gè)選項(xiàng)之一,可以將 Connection
類注入而不需要直接使用它。
將組件注入類時(shí),可以使用以下三個(gè)選項(xiàng)之一:
構(gòu)造方法注入
class UserProvider{ protected $connection; public function __construct( Connection $con ){ $this->connection = $con; } ...
Setter 方法注入
同樣,我們也可以使用 Setter 方法注入依賴關(guān)系:
class UserProvider{ protected $connection; public function __construct(){ ... } public function setConnection( Connection $con ){ $this->connection = $con; } ...
接口注入
interface ConnectionInjector{ public function injectConnection( Connection $con ); } class UserProvider implements ConnectionInjector{ protected $connection; public function __construct(){ ... } public function injectConnection( Connection $con ){ $this->connection = $con; } }
當(dāng)一個(gè)類實(shí)現(xiàn)了我們的接口時(shí),我們定義了 injectConnection
方法來解決依賴關(guān)系。
優(yōu)勢(shì)
現(xiàn)在,當(dāng)測(cè)試我們的類時(shí),我們可以模擬依賴類并將其作為參數(shù)傳遞。每個(gè)類必須專注于一個(gè)特定的任務(wù),而不應(yīng)該關(guān)心解決它們的依賴性。這樣,你將擁有一個(gè)更專注和可維護(hù)的應(yīng)用程序。
如果你想了解