繁体   English   中英

DI容器对工厂有什么好处?

[英]What benefits does a DI container provide over a factory?

这里有很多关于此的讨论,但似乎没有人真正回答这个问题。

我目前正在考虑使用Symfony 2服务容器 我看的越多,看起来我就可以用服务工厂做同样的事了。 请考虑以下示例:

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容器的优势。

是的 - 您正在使用服务定位器(反)模式使用您的DI容器,而不是将您的依赖项注入您的类。 您的班级根本不应该参考您的DI容器。

相反,应该只有一个聚合根,您可以在其中创建容器并解决所有依赖关系。 一旦解决了顶级类实例,然后使用好莱坞原则使用IoC容器解析其所有依赖项(以及依赖项的依赖项等) - 当创建类实例时,它的所有依赖项都会被传入,实例从不要求依赖本身。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM