В чем разница между DI и фабричными моделями? - PullRequest
1 голос
/ 08 апреля 2010

У меня есть класс, который зависит от 3 классов, у всех 3 из которых есть другие классы, на которые они полагаются. В настоящее время я использую класс контейнера для создания всех необходимых классов, внедрения их друг в друга и возврата приложения.

Упрощенная версия контейнера выглядит примерно так:

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
}

Я не уверен, будет ли это классифицировано как FactoryMethod или DI-контейнер. Кажется, что они оба решают одну и ту же проблему одинаково - они создают объекты и внедряют зависимости. У этого контейнера есть несколько более сложных методов построения, таких как загрузка наблюдателей и прикрепление их к наблюдаемым объектам.

Должны ли фабрики выполнять все сборки (загрузка расширений и т. Д.), И контейнер DI должен использовать эти фабрики для внедрения зависимостей? Таким образом, субпакеты, такие как Cache, Response и т. Д., Могут иметь свои собственные специализированные фабрики.

1 Ответ

3 голосов
/ 08 апреля 2010

Контейнер DI - это определенно Фабрика, но это фабрика общего назначения.

Однако, если вы используете его на основе извлечения способом, попросив его создать зависимости дляВы каждый раз, когда вам это нужно, вы будете использовать анти-шаблон Service Locator .Это просто фабрика общего назначения и на самом деле не имеет ничего общего с DI.

True Dependency Injection , как следует из названия, push-based .Вы пишете весь свой код, используя простые шаблоны, такие как Constructor Injection , и используете DI-контейнер для разрешения всего вашего графика зависимостей за один раз в Composition Root приложения , вставляя все зависимости в соответствующиепотребители.

...