在我自己编写的应用程序(MVC)中,我使用依赖注入来传递对象的依赖关系。我不想使用Singleton模式或依赖注入容器。
当应用程序启动时,它有一些程序代码实例化这样的重要对象:(它加载的对象比下面的多,但它们应该足以解释我的内容)
/*
* ------------------------------------------------------
* 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对象中的对象中,我觉得我正在注入$配置对象两次,这是错误的。
显然,当我有越来越多的对象和依赖项时,看起来我会注射相同的对象超过两三次,这真的让我想知道我做错了。
我正在做什么?
答案 0 :(得分:0)
好的,因为$router
没有而且永远不需要知道,$logger
是否知道$config
本身。想象一下,你想用虚拟
class NullLogger { /* "Do nothing" code*/ }
这个类不需要配置,所以当$router
使用$logger
的配置时,它现在就被破坏了:)
除此之外,当您仅传递与类new Logger($config['logger']);
而不是new Logger($config);
类相关联的配置时,它会更干净。为什么现在每个人都必须拥有一切?