gpt4 book ai didi

dependency-injection - 与工厂相比,DI 容器有什么好处?

转载 作者:行者123 更新时间:2023-12-02 02:17:56 25 4
gpt4 key购买 nike

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

我目前正在考虑使用 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 容器的类一样。

最佳答案

Is there something I'm missing here? Because I don't really see the advantage to using a DI container if a factory can do all of that for me.

是的 - 你正在使用你的 DI 容器使用 Service Locator (anti-)pattern而不是将依赖项注入(inject)到类中。您的类根本不必引用您的 DI 容器。

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

关于dependency-injection - 与工厂相比,DI 容器有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9625599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com