Какие части веб-сайта PHP обрабатываются контейнером внедрения зависимостей? - PullRequest
4 голосов
/ 03 февраля 2012

Прочитав триллион расплывчатых руководств по контейнерам для инъекций зависимости, я чувствую, что до сих пор не до конца понял.

Что касается управления приложениями (например, моделей, контроллеров и т. Д.), Как мне управлять автоматическим внедрением зависимостей?

У меня, кажется, есть БОЛЬШОЙ веб-сайт, возможно, с 30-40 различными типами моделей ... действительно ли я создаю один менеджер зависимостей приложений для обработки каждого из этих различных типов?

У меня были люди, которые говорили мне, что DIC предназначены не для предметной области, а скорее для фреймворка, и я также слышал обратное.

Что "правильно"?

БОНУСНЫЙ ВОПРОС:

Если DIC не применимы для объектов уровня домена (например, моделей), как вы передаете зависимости объектам уровня домена?

Ответы [ 2 ]

1 голос
/ 16 сентября 2013

Не очень понятно, в чем вопрос, но я попробую.

Когда речь идет о вещах, которые являются специфическими для приложения (например, модели, контроллеры и т. д.), как мне управлять автоматическим впрыском зависимостей?

Вы используете DIC? Вы написали одну или используете библиотеку?

Может быть, библиотека помогла бы, я автор PHP-DI , поэтому я пристрастен, но библиотека помогает мне автоматически вводить зависимости.

Например, я могу написать:

class UserController
{
    private $formFactory;

    public function __construct(FormFactory $formFactory) {
        $this->formFactory = $formFactory;
    }

    public function createForm($type, $data, $options) {
        // $this->formFactory->...
    }
}

В этой ситуации DIC может определять зависимости, которые хочет ваш контроллер, и автоматически вводить их. Это облегчает жизнь.

У меня, кажется, есть БОЛЬШОЙ веб-сайт, возможно, с 30-40 различными типами модели ... я действительно создаю единый менеджер зависимостей приложений для справиться с каждым из этих различных типов?

Зачем вам это нужно? Я не понимаю необходимости, может быть, вам нужно немного объяснить, в чем проблема.

У меня были люди, которые говорили мне, что DIC не предназначены для домена, но больше для фреймворка, и я также слышал обратное.

Что "правильно"?

IMO нет никакой разницы между "доменными вещами" и "структурными вещами". Единственное, что сложно, это наличие в сущности элементов DIC, потому что это не «синглтон» (не в шаблоне Singleton): эти объекты не «управляются» DIC, вы можете создавать экземпляры вручную везде в вашем коде. Пример:

$user = new User();

Если классу User нужен сервис, то везде в вашем коде вы должны сделать:

$user = new User($service);

Напротив, вам никогда не нужно создавать службу вручную (вам никогда не нужно вызывать «new»), поэтому вы можете позволить контейнеру создать экземпляр и внедрить все.


Я не очень доволен своим ответом, так как он немного расплывчатый, но мне трудно определить, в чем действительно твоя проблема. Может быть, вам следует привести примеры кода или хотя бы немного объяснить.

PS: я изо всех сил пытался понять DI и что такое DIC, не соглашайтесь на «Я думаю, что я получаю немного больше сейчас, хотя и не полностью», я сделал то же самое, и мне потребовались месяцы, чтобы наконец-то понял.

Если это поможет, прочитайте вводный текст на http://mnapoli.github.io/PHP-DI/ и, возможно, также: http://mnapoli.fr/controllers-as-services/ (не имеет прямого отношения, но может помочь)

1 голос
/ 03 февраля 2012

Может быть, не совсем то, что вы ищете, но вот пример использования Dependency Injection Container (DIC)

Допустим, у меня есть Database class и Cache class. Мне нужно иметь доступ к моей базе данных и моему классу Cache внутри других моих классов (моделей, контроллеров и т. Д.).

В такой ситуации DIC пригодится, я могу просто сохранить свой класс Database и Cache внутри класса DIC и передать этот класс DIC в любой другой класс, которому требуется доступ к объектам, которые он содержит

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...