gpt4 book ai didi

php - 工厂中的依赖注入(inject)

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:38:28 24 4
gpt4 key购买 nike

我是 DI 的新手,但我真的很想尝试使用它。

有些事情我不明白。这是一个简单的工厂伪代码,我经常使用。

class PageFactory {
public function __construct(/* dependency list */) {
... //save reference to the dependencies
}

public function createPage($pagename) {
switch ($pagename) {
case HomePage::name:
return new HomePage(/* dependency list */);
case ContactPage::name:
return new ContactPage(/* dependency list */);
...
default:
return null;
}
}
}

它的逻辑非常简单,它根据字符串选择实现实例。这非常有用,因为我可以在以后选择我需要的页面,并且只会创建那个页面。

我将如何重写此代码,以便我的页面实例将由依赖项容器创建,因此我不需要处理工厂及其创建的页面的依赖项?

我看到的唯一解决方案是让我想使用的容器成为工厂的依赖项,然后从工厂内部调用它。我对此有很多问题。

首先,我不想将容器耦合到我的应用程序及其拥有的每个工厂中。

其次,我最大的问题是,对容器的调用非常困惑,它是字符串类型的(即 $container->get('Foo');).我想尽可能少地使用它。如果可能,只做一次。

编辑:

我不想写 DI 容器。我想使用现有的。我的问题是关于用法。我将如何使用 DI 容器代替或在上述工厂内使用,同时保持实例选择的逻辑。

编辑 2:

我开始使用 Dice作为 DI 容器,因为它很轻,并且知道我需要的一切。如果我可以在一个地方使用它并构建整个应用程序,我会更愿意。为此,我需要一种方法来以某种方式摆脱这些工厂,或者以某种方式修改它以使这些页面表现得像依赖项,这样 DI 容器就会为它们提供实例。

编辑 3:

是的,我需要这个用于测试目的。我也是测试新手,但到目前为止它非常棒,我真的很喜欢。

这些页面就是 MVC 框架所称的 Controller 。但是我检查过的所有 MVC 框架都没有让它们的 Controller 可测试,因为它们会自动创建它们的实例。并且因为它们是由系统创建的,所以它们的构造函数参数不能由用户自定义。

有一种简单的方法可以检查任何框架的这一点。我只是查找我应该在特定框架中的 Controller 中使用数据库的方式。大多数框架要么是过程性的,要么使用某种服务定位器,无论哪种方式,它们都从公共(public)范围获取依赖关系,这是我不想做的事情。这就是我不自动化 Controller 实例化的原因。缺点是我现在有这些奇怪的工厂,它们带有很多依赖项。我想将此任务替换为 DI 容器。

大多数框架都实现了自己的测试机制,更像是功能测试,而不是单元测试,但我也不想这样做。

最佳答案

Note: dependency injection is a design pattern, while DI containers are libraries, which produce instances by utilizing dependency injection ... or they are shitty service locators, that someone is selling as latest buzz-thing

正确实现的 DI 容器基本上是一个“智能工厂”。但是实现一个可能会超出您当前的能力范围。这有点复杂,因为一个好的 DI 容器构建整个依赖树。

例如:

Let's say you have a class Foo which needs instances of Alpha and Beta passed in construct. But there is an issue. Instance of Beta also needs in constructor a PDO DSN and an instance of Cache.

A well made DI container will be able to construct the whole dependency tree at once.

与其自己制作一个,不如使用现有的 DI 容器。

我的建议是 Auryn .

关于php - 工厂中的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25447442/

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