1

在我自己编码的应用程序(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 对象中的对象中的任何地方,我都觉得我正在注入 $config 对象两次这是错误的。

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

我在做什么好吗?

4

1 回答 1

0

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

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

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

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

于 2012-12-23T14:15:11.147 回答