我寫了一個使用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,或用於單元測試目的,依賴仍然可以通過。
這是一個壞主意,如果是這樣,爲什麼?
這並不是一個壞主意,此外,在製作模塊/服務/人們使用的任何東西時,建議您在構造函數中構建硬依賴關係。以防萬一有人不使用DI – Unex 2015-03-31 08:36:49