Dependency injection DI容器比工厂有什么好处?

Dependency injection DI容器比工厂有什么好处?,dependency-injection,ioc-container,Dependency Injection,Ioc Container,关于这一点,这里有很多讨论,但似乎没有一个真正回答这个问题 我目前正在考虑使用。不过,我看得越多,就越觉得我可以对一家服务工厂做同样的事情。考虑下面的例子: services.yml services: my_mailer: class: Acme\Mailer arguments: [sendmail] newsletter_manager: class: Acme\Newsletter\Newslet

关于这一点,这里有很多讨论,但似乎没有一个真正回答这个问题

我目前正在考虑使用。不过,我看得越多,就越觉得我可以对一家服务工厂做同样的事情。考虑下面的例子:

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容器的好处

我听说使用工厂会导致代码“依赖于工厂”。我要么不理解这个论点,要么反对工厂的人感到困惑。只有顶级类(compositionroot)才会引用工厂,就像它是唯一一个引用DI容器一样

这里有我遗漏的东西吗?因为我真的看不到 使用DI容器的好处是,如果工厂可以为您完成所有这些工作 我

是-您正在使用DI容器,而不是将依赖项注入到类中。您的类根本不必引用DI容器


相反,应该只有一个聚合根,您可以在其中创建容器并解析所有依赖项。解析顶级类实例后,所有依赖项(以及依赖项的依赖项等)都将使用IoC容器解析-创建类实例时,其所有依赖项都会传入,该实例从不要求依赖项本身。

您能详细解释一下吗?这些例子在功能上是相同的。只有compositionroot有一个对工厂的引用,它与从中引用DI容器的位置完全相同。在这两个示例中,类都不负责实现它们自己的依赖项。如何使用工厂传递依赖项的依赖项?换句话说,使用IoC容器,您可以解析完整的依赖关系图。IoC
newslettesManager
的依赖关系为
MyMailer
。当您在工厂中调用
getNewsletterManager()
时,它将调用工厂中的
getMyMailer()
。我的理解是,服务定位器模式将是我让
NewsletterManager
在构造函数或其他东西中自行解决其依赖关系的地方。你是对的-从消费类的角度来看,在这种特殊情况下没有区别,既然您在工厂中硬编码了依赖项解析,那么这将如何扩展?如果明天您的
NewsletterManager
类需要另一个依赖项,则您必须使用IoC容器更新您的工厂-如果该其他依赖项已经可以使用该容器解析,则无需进行更改。Symfony 2 DI容器不像.NET容器那样具有任何类型的自动依赖项解析,所以那部分不重要。