0

これは依存性注入と見なされますか?

<?php
class BASE_Model extends CI_Model 
{  
    /**
     * inject_class - load class using dependency injection
     *
     * @access public
     * @param  string $path
     * @param  string $class
     * @param  string $func
     * @param  string $method
     **/
    public function inject_class($path, $class, $func, $method)
    {
        // load_class is a function located in system/core/common.php on line 123
        $obj = load_class($class, $path, NULL);
        return $obj->$func();
    }
}

// lets say this is instantiated by a user controller when a new user is made
class User_model extends BASE_Model
{
    public function create()
    {
        echo 'create a new user';
        $request = $this->inject_class('path/to/models', 'Logger_model', 'log');
        echo $request;
    }
}

class Logger_model extends BASE_Model
{
    public function log()
    {
        return 'Logged';
    }
}
4

1 に答える 1

7

いいえ。これは、オブジェクトが依存関係自体をロードする別の方法です。依存性注入のポイントは、すべてのメソッド/オブジェクト/関数がその依存性を引数として取り、それ自体をロードしないことです。引数として依存関係を受け入れていない、別のクラスを単独でロードする注入User_model::createです。

依存性注入のポイントは、カップリングを減らすことです。は、その特定のクラスへの名前とパスをそれ自体の内部にハードコーディングするため、クラスにUser_model結合されます。不要なものをログに記録せずに、それ自体を単独でLogger_model使用またはテストしたい場合は、もうそれを行うことはできません。User_model実際の DI は次のようになります。

public function create(Logger_model $log) {
    // here be dragons
    $log->log();
}

このようにして、何も壊さずにメソッドをテストしたり、必要に応じてコードを変更せずに別のタイプのロガーを使用したりしたい場合は、モック化されたダミーのロギング クラスを挿入できます。

于 2012-08-23T11:21:02.547 に答える