SORU
12 ŞUBAT 2010, Cuma


Nasıl "Bağımlılık Enjeksiyon" basit fonksiyonlar, kullanabilir miyim ve seni rahatsız etmiş olur muyum?

İnsanlar bağımlılık enjeksiyon hakkında konuşuyor ve her zaman yararı duydum, ama gerçekten anlamıyorum.

Eğer bir çözüm "bağımsız olarak veritabanı bağlantıları geçiyorum her zaman" sorun. bunu merak ediyorum

Üzerinde wikipedia girdisini okumaya çalıştım ama örnek sağlam açıklığa kavuşturmak için çalışıyor farkı anlamıyorum yani Java ile yazılmış. ( http://en.wikipedia.org/wiki/Dependency_injection ).

Okudum Bu bağımlılık-enjeksiyon-php makale ( http://www.potstuck.com/2009/01/08/php-dependency-injection/ ), ve bu gibi görünüyor hedefi olduğu için değil geçmek bağımlılıkları için bir nesneyi doğrudan, ama kordona yaratılışın bir nesne ile birlikte yaratılış bağımlılıklarını. Kullanarak php fonksiyonları bir bağlamda, ama uygulamak için nasıl emin değilim.

Ayrıca, aşağıdaki Bağımlılık Enjeksiyon ve bağımlılık enjeksiyon yapmaya çalışan işlevsel bir bağlam içinde seni rahatsız etmiş olur muyum?

Sürüm 1: oluşturmak, ama her gün gibi) yok (kod

function get_data_from_database($database_connection){
    $data = $database_connection->query('blah');
    return $data;
}

Sürüm 2: (veritabanı bağlantısı geçmek yok, ama belki de bağımlılık enjeksiyon değil mi?)

function get_database_connection(){
    static $db_connection;
    if($db_connection){
        return $db_connection;
    } else {
        // create db_connection
      ...
    }
}

function get_data_from_database(){
   $conn = get_database_connection();
   $data = $conn->query('blah');
   return $data;
}

$data = get_data_from_database();

Sürüm 3: ("oluşturulması/veri ayrı ve veritabanı kodu hala, belki de bu bağımlılık enjeksiyon?) olarak sayılır mı yani"nesne

function factory_of_data_set(){
    static $db_connection;
    $data_set = null;
    $db_connection = get_database_connection();
    $data_set = $db_connection->query('blah');
    return $data_set;
}

$data = factory_of_data_set();

Herkes iyi bir kaynak var ya da sadece yöntem ve fayda -kristal berraklığında yapar bu fikir?

CEVAP
31 Mart 2010, ÇARŞAMBA


Bağımlılık enjeksiyon büyük bir söz "benim kurucu olarak biraz daha fazla parametre var".

Global gibi ne awfull Tek dalga önce yaptığın şey :

<?php
class User {
    private $_db;
    function __construct($db) {
        $this->_db = $db;
    }
}

$db   = new Db();
$user = new User($db);

Şimdi, püf bağımlılıkları, böyle bir şey yönetmek için tek bir sınıfı kullanmak için :

class DependencyContainer 
{
    private _instances = array();
    private _params = array();

    public function __construct($params)
    {
        $this->_params = $params;
    }

    public function getDb()
    {
        if (empty($this->_instances['db']) 
            || !is_a($this->_instances['db'], 'PDO')
        ) {
            $this->_instances['db'] = new PDO(
                $this->_params['dsn'],
                $this->_params['dbUser'], 
                $this->_params['dbPwd']
            );
        }
        return $this->_instances['db'];
    }
}

class User
{
    private $_db;
    public function __construct(DependencyContainer $di)
    {
         $this->_db = $di->getDb();
    }
}

$dependencies = new DependencyContainer($someParams);
$user = new User($dependencies);

Sen sadece başka bir sınıf ve daha karmaşık düşünmek gerekir. Ancak, kullanıcı bir sınıf diğer sınıfları çok mesajlar günlük gerekebilir. Sadece bağımlılık kap ve $this->_messages = $di->getMessageHandler() kullanıcı için bazı sınıf için getMessageHandler bir fonksiyonu ekleyin. Hiçbir şey kodunuzun geri kalanı değiştirmek için.

symfony's doc bilgi çok olsun

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Cole Rolland

    Cole Rolland

    23 Kasım 2008
  • FrameCityJackal

    FrameCityJac

    4 Aralık 2010
  • Neil Cicierega

    Neil Ciciere

    22 Mart 2006