明確にしたい依存性注入に関する問題がいくつかあります。最初に言及するのは、私が実装した依存性注入コンテナー (DIC) です。これは、ReflectionClassを使用してコンストラクターを介して依存関係を登録および解決できます。
$container = new DiC;
$container->register('session', 'CSession');
$container->register('response', 'CResponse');
$container->register('model', 'CSomeModel');
$container->register('view', 'CSomeView');
$container->register('controller', 'CSomeController');
依存コントローラー:
class CSomeController extends CController
{
public function __construct(CSomeModel $model, CSomeView $view)
{
// assign arguments here
}
}
これで、DIC を使用してコントローラーをインスタンス化できます。
$controller = $container->resolve('controller');
このアプローチは自動化されていてわかりやすいので気に入っていますが、クラス CController は特定のクラス CSomeModel、CSomeView に依存しており、これは良くありません。MVC トライアドは個別にインスタンス化する必要があります。たとえば、COtherView を CSomeController に渡すことはできません。
私の 2 番目の推測は、DIC を挿入することです。
class CSomeController extends CController
{
public function __construct(DiC $dic)
{
// resolve dependencies through $dic
}
}
これは DiC オブジェクトをグローバルにします。多くの人は、これは DI を実装する方法ではないと主張しています。
両方のアプローチの弱点を解消する第 3 の方法はありますか?