вот небольшой код:
class Mail
{
public $subject;
public function send()
{
DI::get('mailer')->send($this);
}
}
class Mailer
{
public function send(Mail $mail)
{
//
}
}
я не имею в виду DI, я имею в виду Mailer
не передается Mail
через конструктор, только что вынутый из контейнера. Но когда использовать что?
Использование контейнера IoC в качестве локатора службы это анти-шаблон.
Вы должны предпочесть внедрение конструктора, а не внедрение метода или свойства:
Если класс не может выполнять свою работу без зависимости, то добавьте ее в конструктор. Классу нужна новая зависимость, поэтому вы хотите, чтобы ваши изменения сломали вещи. Кроме того, создание класса, который не полностью инициализирован («двухэтапное построение»), является антишаблоном (IMHO). Если класс может работать без зависимости, установщик в порядке. — Источник
Ваш контейнер IoC должен быть доступен только один раз для данного дерева объектов. Когда я сказал accessed
Я имею в виду призывать DI::get('X')
, Вы объекты не должны вызывать DI::get('X')
, Ваши объекты не должны знать о существовании контейнера IoC.
Доступ к контейнеру IoC возможен только из Корень композиции вашего объекта графа.
В веб-приложении MVC корень композиции обычно является фабрикой контроллеров. В консольном приложении его можно найти в основном.
Других решений пока нет …