これについてはここで多くの議論がありますが、本当にその質問に答えるものはありません。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コンテナを参照する唯一のものと同じように、トップレベルのクラス(コンポジションルート)のみがファクトリへの参照を持ちます。
あなたはもっと詳しく説明できますか?例は機能的に同じです。コンポジションルートだけがファクトリへの参照を持ちます。これは、DIコンテナへの参照を持つのとまったく同じ場所です。いずれの例でも、独自の依存関係を実現するクラスはありません。 – ryeguy
工場を使用して依存関係の依存関係をどのように渡すのですか?言い換えれば、IoCコンテナを使用すると、依存関係の完全なグラフを解決できます。 – BrokenGlass
'NewsletterManager'には、' MyMailer'の依存関係があります。ファクトリで 'getNewsletterManager()'を呼び出すと、ファクトリでは 'getMyMailer()'も呼び出されます。サービス・ロケータ・パターンは、コンストラクタなどで、NewsManager自体の依存関係を解決する場所になります。 – ryeguy