Как избежать внедрения зависимостей в объект, чтобы он мог передавать их? - PullRequest
5 голосов
/ 07 апреля 2010

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

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

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

Редактировать: Я использую PHP.

Ответы [ 2 ]

2 голосов
/ 07 апреля 2010

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

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

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

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

(извинения за код 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 за самим интерфейсом. См. Также Рефакторинг для агрегированных услуг .

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

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

В этом случае Abstract Factory является превосходным и универсальным решением .

1 голос
/ 07 апреля 2010

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

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

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

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

...