DI ve fabrika desenleri arasındaki fark nedir?

1 Cevap php

Ben onlar güveniyor diğer sınıfları tüm 3 tanesi 3 sınıfa bağlıdır bir sınıf var. Şu anda, ben, tüm gerekli sınıfları kurmak birbiri içine enjekte ve uygulamayı geri dönmek için bir kap sınıfını kullanıyorum.

Kabın basitleştirilmiş versiyonu şöyle:

class Builder
{
    private $_options;

    public function __construct($options)
    {
        $this->_options = $options;
    }

    public function build()
    {
         $cache = $this->getCache();
         $response = $this->getResponse();
         $engine = $this->getEngine();

         return new Application($cache,$response,$engine);
    }

    public function getResponse()
    {
         $encoder = $this->getResponseEncoder();
         $cache = $this->getResponseCache();

         return new Response($encoder,$cache);
    }

    // Methods for building each object
}

Ben bu FactoryMethod veya DI kapsayıcı olarak sınıflandırılmış olacaktır emin değilim. Her ikisi de aynı şekilde aynı sorunu çözmek için görünüyor - Onlar nesneler oluşturmak ve bağımlılıkları enjekte. Bu konteyner gözlemci yükleme ve gözlemlenebilir nesnelerin onlara atfeden gibi, biraz daha karmaşık yapı yöntemleri vardır.

Fabrika tüm binayı (yükleme uzantıları vb) yapıyor olmalı ve DI konteyner bağımlılıkları enjekte bu fabrikaları kullanmalıyım? Bu şekilde vb Cache, Müdahale gibi alt paketler, her biri kendi özel fabrikalar olabilir.

1 Cevap

A DI Konteyner kesinlikle bir fabrika olduğunu, ancak genel amaçlı bir fabrika bulunuyor.

Sizin için ihtiyaç duyduğunuz her zaman bağımlılıklar oluşturmak için sorarak bir pull-based şekilde kullanırsanız Ancak, Service Locator anti-pattern istihdam olacaktır. Bu sadece genel amaçlı bir fabrika var ve aslında DI ile ilgisi yoktur.

Gerçek Bağımlılık Injection adından da anlaşılacağı gibi, bir, push based. Sen Constructor Injection gibi basit kalıplarını kullanarak tüm kod yazmak ve kendi tüketicilerin içine tüm bağımlılıkları enjekte, uygulamanın Composition Root tek seferde tüm bağımlılık grafiği gidermek için DI kabı kullanın.