2010-04-08 21 views
1

J'ai une classe qui dépend de 3 classes, dont les 3 ont d'autres classes sur lesquelles ils comptent. Actuellement, j'utilise une classe conteneur pour créer toutes les classes requises, les injecter les unes dans les autres et retourner l'application.Quelle est la différence entre les modèles DI et les modèles d'usine?

La version simplifiée du conteneur ressemble à quelque chose comme ceci:

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 
} 

Je ne sais pas si ce serait classé comme FactoryMethod ou un conteneur DI. Ils semblent tous deux résoudre le même problème de la même manière: ils construisent des objets et injectent des dépendances. Ce conteneur a des méthodes de construction plus compliquées, comme charger des observateurs et les attacher à des objets observables.

Les usines devraient-elles faire tout le bâtiment (extensions de chargement, etc.) et le conteneur DI devrait utiliser ces usines pour injecter des dépendances? De cette façon, les sous-packages, comme Cache, Response etc., peuvent chacun avoir leurs propres usines spécialisées.

+0

Copie possible: http://stackoverflow.com/questions/557742/dependency-injection-vs-factory-pattern –

Répondre

3

Un conteneur DI est définitivement une usine, mais c'est une usine polyvalente.

Cependant, si vous l'utilisez de manière base pull-en lui demandant de créer des dépendances pour vous chaque fois que vous en avez besoin, vous seriez en utilisant le Service Locator anti-pattern. C'est juste une usine polyvalente et a vraiment peu à voir avec DI.

Dépendance réelle L'injection est, comme son nom l'indique, poussée. Vous écrivez tout votre code en utilisant des modèles simples comme Constructor Injection, et utilisez le conteneur DI pour résoudre l'ensemble de votre graphe de dépendances en une seule fois dans l'application Composition Root, en injectant toutes les dépendances dans leurs consommateurs respectifs.