Контейнер DI или DI / Service Locator?

вот небольшой код:

class Mail
{
public $subject;

public function send()
{
DI::get('mailer')->send($this);
}
}

class Mailer
{
public function send(Mail $mail)
{
//
}
}

я не имею в виду DI, я имею в виду Mailer не передается Mail через конструктор, только что вынутый из контейнера. Но когда использовать что?

0

Решение

Использование контейнера IoC в качестве локатора службы это анти-шаблон.

Вы должны предпочесть внедрение конструктора, а не внедрение метода или свойства:

Если класс не может выполнять свою работу без зависимости, то добавьте ее в конструктор. Классу нужна новая зависимость, поэтому вы хотите, чтобы ваши изменения сломали вещи. Кроме того, создание класса, который не полностью инициализирован («двухэтапное построение»), является антишаблоном (IMHO). Если класс может работать без зависимости, установщик в порядке. — Источник

Ваш контейнер IoC должен быть доступен только один раз для данного дерева объектов. Когда я сказал accessed Я имею в виду призывать DI::get('X'), Вы объекты не должны вызывать DI::get('X'), Ваши объекты не должны знать о существовании контейнера IoC.

Доступ к контейнеру IoC возможен только из Корень композиции вашего объекта графа.

В веб-приложении MVC корень композиции обычно является фабрикой контроллеров. В консольном приложении его можно найти в основном.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]