2015-03-31 52 views
2

我寫了一個使用DI的開源PHP庫。可以有依賴注入回退嗎?

圖書館有記入的人想使用它的單點,在客戶類,它有一個構造看起來像這樣(簡化):

class Client { 

    protected $depOne; 
    protected $depTwo; 

    public function __construct(DependencyOne $depOne, DependencyTwo, $depTwo) 
    { 
     $this->depOne = $depOne; 
     $this->depTwo = $depTwo; 
    } 
} 

DependencyOne和DependencyTwo也有自己的依賴關係。這意味着,任何人想要使用沒有使用DI需要做這樣的事情我的圖書館:

$dependencyThree = new DependencyThree(); 
$dependencyFour = new DependencyFour(); 
$dependencyFive = new DependencyFive(); 
$dependencyOne = new DependencyOne($dependencyThree, $dependencyFour); 
$dependencyTwo = new DependencyTwo($dependencyFive); 
$client = new Client($dependencyOne, $dependencyTwo); 
$someStuff = $client->doTheThing(); 

難道是不好使的依賴注入只是該類可選的?例如

class Client { 

    protected $depOne; 
    protected $depTwo; 

    public function __construct(DependencyOne $depOne = null, DependencyTwo, $depTwo = null) 
    { 

     if (!isset($depOne)) { 
      $depThree = new DependencyThree(); 
      $depFour = new DependencyFour(); 
      $depOne = new DependencyOne($depThree, $depFour); 
     } 

     if (!isset($depTwo)) { 
      $depFive = new DependencyFive(); 
      $depTwo = new DependencyTwo($depFive); 
     } 

     $this->depOne = $depOne; 
     $this->depTwo = $depTwo; 
    } 
} 

這意味着有人不使用DI可能只是這樣做:

$client = new Client(); 
$someStuff = $client->doTheThing(); 

那些想要使用DI,或用於單元測試目的,依賴仍然可以通過。

這是一個壞主意,如果是這樣,爲什麼?

+0

這並不是一個壞主意,此外,在製作模塊/服務/人們使用的任何東西時,建議您在構造函數中構建硬依賴關係。以防萬一有人不使用DI – Unex 2015-03-31 08:36:49

回答

1

這正是我在開源項目中所做的,我認爲這是一個非常好的解決方案。

它爲用戶提供了一種方法,讓用戶不費吹灰之力就可以開始使用您的庫,並且同時讓他們有可能覆蓋任何內容。

另一種解決方案我有時選擇是有一個或builder classfactory,參見例如this constructor具有強制性的參數,但ContainerBuilder隱藏這種複雜性。

構建器的優點是它將配置部分帶出課程。如果配置部分開始增長(關注點分離),這很有用。

+0

有用,謝謝。我結束了去工廠,所以人們可以通過執行我的庫實例化: $ client = ClientFactory :: create($ apiKey); – theandywaite 2015-04-04 09:38:05

1

我同意@Unex。使DI成爲可選項並不錯,但在構造函數中,我會在庫中提供一個工廠。 這樣你就可以保持與DI一樣的鬆散耦合,並保持客戶端類的單一責任。客戶端類爲什麼知道如何構建其他類?類構造函數是關於自我的知識,僅此而已。請記住,構建一個完整的依賴鏈可能很大且很複雜,也許你必須在bootstrap中讀取配置文件,訪問其他php模塊中定義的常量,調用實用函數等。你不想在構造函數中擁有所有這些代碼。

+0

有用,謝謝! – theandywaite 2015-04-04 09:37:24