2013-04-24 53 views
4

我在使用依賴注入時出現了一些問題,我想澄清一下。首先要提到的是我實現的依賴注入容器(DIC),它能夠使用ReflectionClass通過構造函數註冊和解決依賴關係。如何在PHP中正確注入依賴關係

$container = new DiC; 
$container->register('session', 'CSession'); 
$container->register('response', 'CResponse'); 
$container->register('model', 'CSomeModel'); 
$container->register('view', 'CSomeView'); 
$container->register('controller', 'CSomeController'); 

從屬控制器:

class CSomeController extends CController 
{ 
    public function __construct(CSomeModel $model, CSomeView $view) 
    { 
    // assign arguments here 
    } 
} 

現在控制器可通過DIC被實例:

$controller = $container->resolve('controller'); 

我喜歡這個方法,因爲它是自動化的和描述性的,但是類CController取決於特定類CSomeModel,CSomeView不好。 MVC三元組應該獨立​​實例化 - 例如,我無法將COtherView傳遞給CSomeController。

我的第二個猜測是注入DIC:

class CSomeController extends CController 
{ 
    public function __construct(DiC $dic) 
    { 
    // resolve dependencies through $dic 
    } 
} 

這使得一個對象DIC全球,許多人認爲這是不執行DI的方式。

有沒有第三種方法可以消除這兩種方法的弱點?

+0

你介意發佈你的'DiC'類嗎? – 2013-04-29 04:15:48

+1

您應該看看[Laravel4](http://four.laravel.com/docs/ioc)如何處理該問題,特別是「綁定到實施的接口」會話。你可以在[Github]找到相關的源代碼(https://github.com/laravel/framework/blob/master/src/Illuminate/Container/Container.php) – vFragosop 2013-05-01 03:57:28

+0

Symfony2使用一個非常堅固的基於Java的DI組件Spring ...這與你正在做的類似..進一步.. http://symfony.com/doc/2.0/components/dependency_injection/introduction.html – Dinesh 2013-05-03 05:36:33

回答

1

如果您正在尋找「自動佈線」,切換到接口並實現您的具體模型/視圖/等。針對該界面的類。這樣你可以使用反射來配對雙方。

在容器級別有明確指定依賴關係的機制也是有意義的。

+0

有沒有教程在這個地方? – 2013-07-31 06:52:11

1

我認爲這兩種方法都是相關的。如果您希望在第一種方法中更靈活,您可以更改構造函數以將父類作爲依賴項。然後,可以注入從該父類繼承的每個對象。即

class CSomeModel extends AbstractCModel {} 
class CSomeOtherModel extends AbstractCModel {} 

public function __construct(AbstractCModel $model, AbstractCView $view) {} 

第二種方法適用於需要訪問工廠的情況。即如果您需要訪問同一對象的多個實例。

+1

IoC類通過使用PHP Reflection解決了依賴關係。通過注入抽象類,我鬆散的自動化... – user1517081 2013-04-24 17:16:08

+0

一個接口會比抽象類更好。 – 2013-05-04 01:06:24

相關問題