Bağımlılık Enjeksiyon basit bir uygulaması

1 Cevap php

this soruyu okuduktan sonra birisi bana bu PHP sınıfları ile doğru Bağımlılık enjeksiyon uygulamak için nasıl anlamanıza yardımcı olabilir merak ediyorum:

class DBClass
{
    private $mMysqli;
    function  __construct(mysqli $database)
    {
        $this->mMysqli=$database;
    }
    function __destruct()
    {
        $this->mMysqli->close();
    }

    public function listUsers()
    {
        $query='SELECT * FROM Utente;';
        $resultset=$this->mMysqli->query($query);
        while($row = $resultset->fetch_array(MYSQLI_ASSOC)) {
            echo $row['username'];
            echo $row['pwd'];
            echo "<br />\n";
        }

    }

    public function runQuery($query)
    {
        return $resultset=$this->mMysqli->query($query);
    }

    public function getConnection()
    {
        return $this->mMysqli;
    }
}

Oturum sınıfı:

class Session
{
    private $_session;
    public $maxTime;
    private $database;

    public function __construct(DBClass $database)
    {
        $this->database=$database;
        $this->maxTime['access'] = time();
        $this->maxTime['gc'] = get_cfg_var('session.gc_maxlifetime');
        session_set_save_handler(array($this,'_open'),
                array($this,'_close'),
                array($this,'_read'),
                array($this,'_write'),
                array($this,'_destroy'),
                array($this,'_clean')
                );
        register_shutdown_function('session_write_close');
        session_start();
        ...
     }
}   

(Şu anda oturum açan kullanıcı hakkında ayrıntılı bilgi için) Kullanıcı Sınıfı:

class User
{
    private $username;
    private $role;
    private $session;

    function __construct($session)
    {
        $this->session=$session;
        ...
    }
}

Haricen:

$connection=new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE);
$database=new DBClass($connection);
$session=new Session($database);
$user=new User($session);

Bu doğru yoldur?

1 Cevap

Evet. Artık daha az kavrama sağlar yapıcı aracılığıyla bağımlılıkları enjekte edilir. Artık daha kolay bu bağımlılıkları takas olabilir, örneğin unittesting zaman Mocks ile değiştirebilirsiniz.

Bir TypeHint olarak somut DBClass yerine kullanarak interface tarafından rağmen hala bazı bağlantıya sahip. Farklı bir DBClass kullanmak isteyeyim zaman Yani, DBClass adında olurdu. Sen beton sınıfları yerine uygulamak zorunda olduğunu coding against an interface tarafından daha gevşek bir bağlantı elde edebiliriz.

(Açıklamalarda istedi gibi) bir sınıfın sadece tek örneklerini oluşturmak için, örneği henüz oluşturulmuş olup olmadığını takip oluşturmak ve tutmak için bir Singleton (Kevin Peno önerilen gibi) ya da bir fabrika kullanabilirsiniz ya. Ya da bir DI Hizmet Fabrikası benzer Konteyner, henüz aynı şey kullanın. Bu yaratan ve sizin için nesneleri yönetir.

Symfony Components library has a Dependency Injection Container daha Servisi konteynırları ile DI bu geliştirmek için nasıl konuya mükemmel dokümantasyon ve tanıtımı ile. Kaplar ayrıca örnekleri sınırlamak için kullanılabilir. Check it out.