Внедрение зависимостей - это шаблон проектирования программного обеспечения, который используется во многих языках программирования.Вот что Википедия говорит об этом:
В программной инженерии внедрение зависимостей - это метод, при котором один объект (или статический метод) предоставляет зависимости другого объекта.Зависимость - это объект, который можно использовать (сервис).Инъекция - это передача зависимости зависимому объекту (клиенту), который будет его использовать.Передача сервиса клиенту, а не предоставление клиенту возможности создать или найти сервис, является фундаментальным требованием шаблона.
Ниже приведены проблемы с классом, создающим экземпляры зависимостей.и как DI Angular решает это:
- трудно поддерживать .Если конструктор зависимости изменяется, то нам придется распространить это изменение на все места в коде, где был создан экземпляр этого класса.
Рассмотрим этот код с ЗАВИСИМОСТЬ ЗАВИСИМОСТИ В ANGULAR - от Thoughtram, например:
class Car {
constructor() {
this.engine = new Engine();
this.tires = Tires.getInstance();
this.doors = app.get('doors');
}
}
Здесь, поскольку класс Car самостоятельно создает экземпляры своих зависимостей, если завтра скажем, конструкторкласса Engine
был обновлен и теперь требует fuelType
, нам придется передать это конструктору Engine
, иначе наш код не будет работать.Каждый раз, когда происходит изменение в способе создания зависимости, мы должны вносить изменения в каждом отдельном месте, где мы создаем экземпляр этой зависимости.
РЕШЕНИЕ: ЕслиМы полагаемся на Angular Injector, чтобы предоставить нам эти зависимости, это будет выглядеть примерно так:
class Car {
constructor(engine, tires, doors) {
this.engine = engine;
this.tires = tires;
this.doors = doors;
}
}
Как вы можете видеть, классу Car
не нужно беспокоиться об изменении чего-либо в нем, так какему не нужно беспокоиться о создании экземпляров своих зависимостей.
Это
трудно для юнит-теста .Как упомянуто
Паскаль в его
статье :
Представьте, что вы хотитечтобы проверить этот класс.Как бы вы заменили Engine с зависимостью MockEngine в этом коде?При написании тестов мы хотим тестировать различные сценарии, в которых используется наш код, поэтому каждый сценарий требует своей собственной конфигурации.Если мы хотим написать тестируемый код, нам нужно написать повторно используемый код.Наш код должен работать в любой среде, если все зависимости удовлетворены.Что приводит нас к выводу, что тестируемый код является кодом многократного использования и наоборот.
РЕШЕНИЕ: Если мы используем DI-код Angular, код будет выглядеть примерно такВот это:
var car = new Car(
new MockEngine(),
new MockTires(),
new MockDoors()
);
Посмотрите, как легко было бы создать макет любой из наших зависимостей.
Это
не синглтон .Все созданные зависимости будут локальными для класса.Таким образом, вы не сможете использовать один сервис для нескольких классов, если захотите.Совместное использование данных будет сложным для управления, и это сделает всю установку более сложной.Часы
"Почему инъекция зависимости" от
kudvenkat чтобы узнать больше.
РЕШЕНИЕ: Если мы полагаемся на инжектор Angular для этих зависимостей, мы можем быть уверены, что инжектор Angular предоставит нам Singleton, если не указано иное (в случае, если вы добавили услугу к providers
компонента)
Я снова связываю несколько ресурсов, которые были бы чрезвычайно полезны для понимания DI в Angular:
- ВПРЫСК ЗАВИСИМОСТИ В УГЛОВОЙ
- Инъекция угловой зависимости
- Почему инъекция зависимости