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 オブジェクトを 2 回挿入しているように感じますそしてそれは間違っている。

明らかに、オブジェクトと依存関係がますます多くなると、同じオブジェクトを2、3回以上注入しているように見え、それが間違っているのではないかと本当に疑問に思うでしょう。

私がしていることは大丈夫ですか?

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 に答える