2012-03-08 12 views
3

これについてはここで多くの議論がありますが、本当にその質問に答えるものはありません。DIコンテナは工場にどのようなメリットをもたらしますか?

私は現在、Symfony 2 service containerの使用を検討中です。私はそれをもっと見るほど、サービス工場で同じことをやり遂げることができるように思えます。以下の例で考えてみましょう:ニュースレターマネージャを取得する

services.yml

services: 
    my_mailer: 
     class:  Acme\Mailer 
     arguments: [sendmail] 
    newsletter_manager: 
     class:  Acme\Newsletter\NewsletterManager 
     arguments: [@my_mailer] 

を、私のような何かを実行します。

// this has been configured with the above yml file 
$serviceContainer = new ServiceContainer(); 
$newsletterManager = $serviceContainer->get("newsletter_manager"); 

をただし、以下の工場出荷時のスタイルのコードを考えます

class ServiceContainer 
{ 
    public function getMyMailer() 
    { 
     return new Acme\Mailer("sendmail"); 
    } 

    public function getNewsletterManager() 
    { 
     return new Acme\Newsletter\NewsletterManager($this->getMyMailer()); 
    } 
} 

それを使用して:

$serviceContainer = new ServiceContainer(); 
$newsletterManager = $serviceContainer->getNewsletterManager(); 

ここには何かがありますか?なぜなら、工場が私のためにそれをすべて行うことができるなら、私はDIコンテナを使う利点を実際には見ないからです。

工場を使用していると聞いたことがありますが、あなたのコードは「工場に依存しています」。私はこの議論を理解していないか、工場に対して論争している人が混乱している。 DIコンテナを参照する唯一のものと同じように、トップレベルのクラス(コンポジションルート)のみがファクトリへの参照を持ちます。

答えて

2

ここに何か不足していますか?私が DI容器を使用する利点を実際には見ないので、工場ではすべて のそれを行うことができます。

はい - Service Locator (anti-)patternを使用してDIコンテナを使用しています。クラスに依存関係を注入するのではなく、クラスでDIコンテナを参照する必要はありません。

代わりに、コンテナを作成してすべての依存関係を解決する単一の集約ルートが必要です。一番上のクラスのインスタンスを解決したら、すべての依存関係(および依存関係の依存関係など)は、Hollywood Principleを使用してIoCコンテナを使用して解決されます。クラスインスタンスの作成時にすべての依存関係が渡されます。インスタンス依存関係自体を求めることはありません。

+0

あなたはもっと詳しく説明できますか?例は機能的に同じです。コンポジションルートだけがファクトリへの参照を持ちます。これは、DIコンテナへの参照を持つのとまったく同じ場所です。いずれの例でも、独自の依存関係を実現するクラスはありません。 – ryeguy

+0

工場を使用して依存関係の依存関係をどのように渡すのですか?言い換えれば、IoCコンテナを使用すると、依存関係の完全なグラフを解決できます。 – BrokenGlass

+0

'NewsletterManager'には、' MyMailer'の依存関係があります。ファクトリで 'getNewsletterManager()'を呼び出すと、ファクトリでは 'getMyMailer()'も呼び出されます。サービス・ロケータ・パターンは、コンストラクタなどで、NewsManager自体の依存関係を解決する場所になります。 – ryeguy

関連する問題