依赖注入。感觉就像我不止一次注射同一个物体

时间:2012-12-23 14:11:23

标签: php oop

在我自己编写的应用程序(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对象中的对象中,我觉得我正在注入$配置对象两次,这是错误的。

显然,当我有越来越多的对象和依赖项时,看起来我会注射相同的对象超过两三次,这真的让我想知道我做错了。

我正在做什么?

1 个答案:

答案 0 :(得分:0)

好的,因为$router没有而且永远不需要知道,$logger是否知道$config本身。想象一下,你想用虚拟

替换记录器
class NullLogger { /* "Do nothing" code*/ }

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

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