2014-01-26 102 views
1

對於體面的OOP和DI我是一個新手,因此想知道如果下面的例子及其包含依賴對象的引導類的初始化模式真的可以使用,例如:依賴注入和對象的初始化

new Session(
    new Config, 
    new Database ( 
     new Config 
    ), 
    new Page ( 
     new Config 
    ), 
    new Statistics ( 
     new Database ( 
     new Config 
    ) 
    ), 
    new Notification, 
    new Filter 
); 

我相信,那些熟悉DI的人可以在bootstrap對象中說一些關於上述代碼的東西嗎?

它看起來有點笨重,但是這樣好嗎?是這樣,我們可以稱之爲好嗎/正確/可接受

+1

這是「可用」,但想象一直在做這個。查看您配置(一次)然後用於自動解析對象並注入依賴項(多次)的DI容器會更好。看看[Pimple](http://pimple.sensiolabs.org/)和[Illuminate \ Container](http://laravel.com/api/4.1/Illuminate/Container/Container.html)。 – Jon

+0

@Jon我是自動解析器的新手,能否請您提供一個如何使用它的例子的答案?我認爲這對未來的讀者會有用。 –

+0

那麼,我會基本上從文檔複製粘貼...我認爲人們直接轉到源代碼更好。 – Jon

回答

1

後學習上的新問題進行調查的一段時間,我終於得出結論,對於我而言,最好的依賴注入容器是:

Dice - minimalist Dependency Injection Container for PHP.

它只有一個文件,並以有代碼,從我的問題是被初始化,所有你需要的是:

(new Dice)->create('Session'); 

骰子 DIC會照顧其餘的。您可以在Tom Butler(開發人員)主頁上閱讀有關骰子的更多信息。

我個人認爲這是注入依賴關係的最佳(最短和最簡單)方式,默認情況下應該內置在PHP中,我真的很奇怪爲什麼它不是?


爲了從特定的依賴注入容器解耦你的代碼,我還是建議使用自定義類包裝:

class DIC extends Dice 
    { 
    function __construct($component, array $args = array(), $callback = null, $forceNewInstance = false) 
     { 
      return parent::create($component, $args, $callback = null, $forceNewInstance = false); 
     } 
    } 

這也將有助於縮短甚至更多的初始化過程,令人難以置信的令人驚歎。現在

,以實例化複雜套DIS的,如:

new Session(new Config, new Database (new Config), new Page (new Config), new Statistics (new Database (new Config)), new Notification, new Filter); 

所有你需要做的是:

new DIC('Session'); 

如果你想一個參數傳遞給構造函數,你可以去:

new DIC('Session', array($param)); 

我不知道別人怎麼想,但我發現這個驚人的(至少到目前爲止,我在今天的位置)。

請問,請客氣評論一下可能存在的缺點,以後我會在將來如何使用這個DIC(Dice)或者這個方法來面對!