2012-06-29 5 views
1

Я читал информацию о впрысках зависимостей и контейнерах DI. Однако я не могу обойти эту концепцию.PHP: DI Container

Как бы контейнер DI знал, что «контроллер» зависит от «загрузчика» и нагрузки «загрузчика» перед «контроллером»?

Как я вижу это в том, что ему потребуется какое-то конфигурационный файл для отслеживания зависимостей, и если да, не так просто проще написать:

// Controller 
function __construct() { 
    $this->load = new \Framework\Core\Loader; 
} 
+0

Кстати, еще проще (и очевидно) написать 'function __construct ($ loader) {$ this-> load = new $ loader; } '. –

ответ

2

Да, Dics нужно заранее Конфигурация, либо в каком-либо файле конфигурации, либо путем объединения между фабричными закрытиями или путем аннотирования исходного кода.

Да, проще создавать экземпляры в ctor, но это устранит все преимущества DI, потому что вы больше не вводите зависимости.

Также обратите внимание, что вам не нужна DIC, чтобы сделать DI. DI - это просто действие инъекций зависимостей в вашем коде через конструкторы, сеттеры или методы использования.

+0

Итак, если бы я хотел сделать DI, я бы ввел класс Loader в контроллер, например. '$ controller = new Controller ($ loader);' then in controller 'function __construct ($ injected) {$ this-> load = $ injected; } '? – user555

+0

@user Да. Вы просто вводите все зависимости, чтобы поместить объект в допустимое состояние через конструктор. Возьмите эту концепцию сначала, прежде чем возиться с DIC. Для большинства приложений вам все равно не нужны. – Gordon

+0

Как мне пойти, чтобы загрузить класс. Должен ли я создать фабрику для создания нового класса и вставить все необходимые зависимости? – user555

0

Просто, чтобы закончить то, что Гордон сказал:

Да, Dics нужно авансовые конфигурации, либо в каком-то файле конфигурации или через штабелирование вместе закрытия заводов или аннотирования вашего исходного кода.

Самый простой/быстрый способ здесь аннотации, проверить этот пример:

class Loader { 
    //... 
} 

class MyController { 
    /** 
    * @Inject 
    * @var Loader 
    */ 
    private $loader; 

    public indexAction() { 
     // You can use $this->loader 
    } 

} 

В этом примере, зависимость (загрузчик) была введена через аннотацию: код понятен, читаемый, и вам не нужно писать какой-либо файл конфигурации. Это ИМО - самое простое решение.

Если вас интересует такой подход, я привел пример от PHP-DI, рамки для инъекций зависимостей, работающих с аннотациями (на которых я работаю).

Смежные вопросы