Как постараться не вводить зависимости в объект так, чтобы он мог передать их?

Я интересуюсь применением внедрения зависимости в мой текущий проект, который использует шаблон MVC.

Мои контроллеры назовут модели и поэтому должны будут ввести зависимости в модели. Чтобы сделать это, контроллер должен иметь зависимости (такие как объект базы данных) во-первых. Контроллер не должен использовать некоторые из этих зависимостей (таких как объект базы данных), таким образом, я чувствую, что ему нельзя дать эту зависимость. Однако это должно иметь эти зависимости, если это должно ввести их в объекты модели.

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

Править: Я использую PHP.

5
задан Peter Horne 7 April 2010 в 10:42
поделиться

2 ответа

Я согласен с вашими опасениями. Запах кода - принимать зависимости с единственной целью - передать их другим зависимостям.

В зависимости от точного взаимодействия между этими зависимостями у вас есть несколько вариантов:

Если требуется только один экземпляр зависимости

Если вашему Контроллеру нужен только один экземпляр зависимости, тогда просто возьмите зависимость от этого.

(извинения за код C #)

Не этого делать:

public class MyController
{
    public MyController(IDb db)
    {
        var dep = new MyDependency(db);
        // Use dep or save it for later
    }
}

Вместо этого вы можете сделать следующее:

public class MyController
{
    public MyController(MyDependency dep)
    {
        // Use dep or save it for later
    }
}

Вы можете рассмотреть MyDependency за интерфейсом сам. См. Также Рефакторинг для агрегированных служб .

Если вам нужно создать несколько экземпляров в течение срока службы контроллера

Иногда, однако, вам нужно создать несколько экземпляров динамически. Это часто бывает, когда вам нужно значение, доступное только во время выполнения, прежде чем вы сможете полностью заполнить зависимость.

В этом случае Абстрактная фабрика является отличным и универсальным решением .

2
ответ дан 15 December 2019 в 06:21
поделиться

Я не говорю из опыта PHP, но вы должны посмотреть в Контейнеры инверсии управления (IOC) .

В этом вопросе на StackOverflow говорится о контейнерах IOC для PHP. Для быстрого обзора некоторых других преимуществ контейнеров IOC вам следует проверить этот вопрос, вероятно, один из моих любимых на сайте. Проверьте последний ответ;)

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

Большинство людей не понимают, что контейнер IOC устраняет необходимость хранения временных зависимостей. Это, в свою очередь, делает ваш код более чистым и понятным. Каждый класс (или модуль) вашего кода просто спрашивает, что ему нужно. Контейнеры IOC могут управлять временем жизни объекта, поэтому даже если два класса независимо запрашивают одну и ту же зависимость, они могут получить один и тот же экземпляр, что довольно удобно.

1
ответ дан 15 December 2019 в 06:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: