我一直在練習我的整個PHP應用程序的構造函數依賴注入。我不想用對象創建來拋棄我的代碼,所以工廠來拯救,或者至少我想。依賴注入與工廠
我開始與工廠連接最多的部件,然後一些工廠開始使用其他工廠拿到的依賴,極大的,使所有的創建代碼在一個地方。然而,一旦工廠開始相互使用(或者如下面的代碼本身),我遇到了循環依賴問題,這些問題根本無法解決。例如,我的MapperFactory利用自身注入與其他地圖製圖員(他們需要彼此建立起一個完整的對象圖「預先加載」):
class MapperFactory
{
public function create($type)
{
switch (true) {
case 'Item':
$mapper = new ItemMapper(
$this->create('Field')
);
break;
case 'Field':
$mapper = new ItemMapper(
$this->create('Item')
);
break;
default:
throw new Exception('Unknown mapper');
}
return $mapper;
}
}
$mf = new MapperFactory();
$mf->create('Item');
它是一個簡單的例子,但一個越來越普遍的問題,因爲該應用程序正在發展。錯誤從PHP(Xdebug的安裝)背面是:
Fatal error: Maximum function nesting level of '100' reached, aborting!
完全理解爲什麼PHP是抱怨(雖然沒有看到它的到來TBH)。
我的問題是,我已徹底無緣工廠的地步?我正確使用工廠嗎?它看起來不是,但除了循環依賴(非常重要但是),工廠是將所有構建/佈線邏輯遠離主應用程序的優雅解決方案。
我不認爲它與工廠的問題。首先,我沒有得到「開關(真)」部分。不應該是「切換($類型)」?其次,你的代碼(如果我閱讀正確的話)無止境地遞歸。也許你應該只在你準備好使用那個實例變量時創建子字段或子項目。或者想出一些結束遞歸的東西。 – Marvo 2012-08-13 17:25:17
我猜'開關(真)......不是你想寫的東西。但即使使用'switch($ type)',如果'$ type'是'Field'或'Item',你會得到一個無限循環。 – Yoshi 2012-08-13 17:26:14