【问题标题】:Dependency Injection. Feel like I'm injecting the same object more than once依赖注入。感觉就像我不止一次注入同一个对象
【发布时间】:2012-12-23 14:11:23
【问题描述】:

在我自己编码的应用程序(MVC)中,我使用依赖注入来传递对象的依赖关系。我不想使用单例模式或依赖注入容器。

当应用程序启动时,它有一些像这样实例化重要对象的程序代码:(它加载的对象比下面的要多,但它们应该足以解释我的意思)

/*
* ------------------------------------------------------
* INSTANTIATE THE APPLICATION CLASS
* ------------------------------------------------------
*/
$app = new App();
$app->environment('development');


/*
* ------------------------------------------------------
* INSTANTIATE THE CONFIGURATION CLASS
* ------------------------------------------------------
*/
$config = new Config();


/*
* ------------------------------------------------------
* INSTANTIATE THE LOGGER CLASS
* ------------------------------------------------------
*/
$logger = new Logger($config);


/*
* ------------------------------------------------------
* INSTANTIATE THE LOCALE CLASS
* ------------------------------------------------------
*/
$locale = new Locale();


/*
* ------------------------------------------------------
* INSTANTIATE THE HTTP RESPONSE CLASS
* ------------------------------------------------------
*/
$httpResponse = new HttpResponse();


/*
* ------------------------------------------------------
* INSTANTIATE THE ROUTER CLASS
* ------------------------------------------------------
*/
$router = new Router($config, $logger, $httpResponse);
$router->route();

如您所见,$logger 对象依赖于 $config 对象,我将 $config 对象注入到 $logger 对象构造函数中。

现在,当我实例化 $router 对象时,您可以看到它有 3 个依赖项($config、$logger 和 $httpResponse)。

我只是觉得 $logger 对象如何将 $config 对象保存在其中很奇怪,所以在任何地方我将 $config 和 $logger 对象分别注入到像 $router 对象中的对象中,我觉得我正在注入 $配置对象两次,它是错误的。

显然,当我拥有越来越多的对象和依赖项时,我似乎将同一个对象注入超过两三次,这真的会让我怀疑我是否做错了。

我做的好吗?

【问题讨论】:

    标签: php oop


    【解决方案1】:

    没关系,因为$router 不需要也不应该知道$logger 是否知道$config 本身。想象一下,你想用一个假人替换记录器

    class NullLogger { /* "Do nothing" code*/ }
    

    这个类不需要配置,所以当$router使用$logger的配置时,现在就坏了:)

    除此之外,当您仅传递与new Logger($config['logger']); 之类的类相关联的配置时,无论如何它会更干净,而不是new Logger($config);。为什么每个人都必须现在的一切?

    【讨论】:

    • 只传递$logger 对象而不是它的不同部分的副本不是更节省内存吗?
    • @jeroen “$logger 的部分”是什么意思?
    • 我的意思是一个通用的$config 对象,而不是像$config['logger'] 等类本身的副本。我假设Logger 类中的$config['logger'] 创建了变量的副本( $config) 的一部分,而对象是通过引用传递的。
    • 我猜$config 不是一个对象,无论如何$config['logger'] 不会是它的副本,因为a)它只是一部分,b)PHP 使用写时复制。但真正的问题是:在干净的代码之前,您似乎更喜欢“无类型”方法。万物皆知,$config 与万物相结合。我什至会更进一步,只传递值(使用工厂方法/类)而不是配置:$logger = FileLogger:create($config); 并从$config 中提取所需的值。初始化后,无论如何都不再需要配置了;)
    • 这不是我喜欢的,我只是想知道它;尤其是在我的浏览器挂起的 codeignitor 中做了一次var_dump($this) 之后......
    猜你喜欢
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多