Внедрение зависимостей — это шаблон проектирования приложений, также называемый DI, который был введен в angular dart 2, и совсем недавно мне пришлось ломать голову над ним, следуя руководству по обучению для тура по героям.

Я совершенно уверен, что некоторые разработчики angular dart столкнулись с некоторыми проблемами в понимании того, что такое внедрение зависимостей и насколько оно важно при написании крупномасштабных программ.

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

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

Давайте начнем.

Во-первых, создайте один файл дротика и внутри него создайте класс для Car и объявите переменную экземпляра типа String для двигателя, типа String для шин и типа Integer для топлива. .

Имя переменной Engine будет состоять из информации о типе двигателя, используемого классом Car, шины будут содержать информацию о названии шины, используемой автомобилем, и, наконец, топливо состоит из информации о том, литров топлива требуется для исправной работы автомобиля.

Теперь давайте посмотрим на это с другой стороны: автомобиль, по крайней мере, зависит от двигателей, шин и топлива, чтобы он функционировал хорошо, за исключением случаев, когда вы намерены стать суперменом в своей поездке. Переменные-зависимости здесь — это двигатель, шины и топливо, а класс Car зависит от них, поэтому наша программа выглядит так.

class Car{
String engine;
String tires;
int fuel;
}

Мы все работали над классами и имеем достаточно опыта в том, как они работают.

Теперь переменная экземпляра класса Car или переменная зависимости не могут работать где-либо еще, потому что они предназначены просто для класса Car, но что, если нам нужен новый BugattiCar с другим значением для класса Car Двигатель и шины, но тот же литр топлива.

Мы не можем использовать переменную зависимости топлива в классе Car в классе BugattiCar, что означает, что мы должны создать другую переменную зависимости внутри класс BugattiCar. В простой программе это не имеет особого значения, но в больших программах имеет значение, отсюда и необходимость внедрения зависимостей в angular dart.

Поэтому мы собираемся решить эту проблему и сделать ее более подходящей для крупномасштабных приложений. Вернемся к реальному сценарию: нам нужны двигатели, шины и топливо для всех автомобилей, включая BugattiCar, но что, если мы хотим использовать одни и те же двигатели для разных автомобилей? например TeslaCar, MustangCar и т. д.

Чтобы решить эту проблему, мы создадим класс carBuildingRequirements и объявим все переменные зависимости в этом классе и избавимся от всех переменных зависимостей, объявленных в классе Car, поэтому наш код выглядит так:

class Car{
}
class carBuildingRequirements{
String engine;
String tires;
int fuel;
carBuildingRequirements(this.engine, this.tires, this.fuel);
}

При этом, если мы создадим класс BugattiCar, TeslaCar или blahblahCar, мы сможем начать извлекать нужные нам детали из carBuildingRequirements, поэтому нам не нужно повторять код снова и снова.

Итак, внутри класса Car мы создаем экземпляр класса carBuildingRequirement, и наш код выглядит следующим образом:

class Car{
//Instance of class carBuildingRequirements
carBuildingRequirements requirements = new carBuildingRequirements(‘4 cylinders’, ‘3 durex tires’, 20);
}
class carBuildingRequirements{
String engine;
String tires;
int fuel;
carBuildingRequirements(this.engine, this.tires, this.fuel);
}

Но проблема с этим приведенным выше кодом заключается в том, что если мы создаем автомобиль, мы застреваем с описанием двигателя, описанием шин и требуемыми литрами топлива в параметре carBuildingRequirements в классе Автомобиль. Возможно, со временем Car требует больше литра топлива для правильной работы, но у нас нет гибкости для внесения изменений, пока мы не перепишем параметр carBuildingRequirements в классе Car.

Вот где внедрение зависимостей весьма полезно; класс carBuildingRequirements является зависимостью класса Car, а также будет зависимостью любого другого произведенного автомобиля.

Итак, теперь мы не создаем экземпляр класса carBuildingRequirements до тех пор, пока не создадим экземпляр класса Car, поэтому мы можем добавить наш Car и передайте параметр для доступа к текущему вызову члена с помощью ключевого слова this. Итак, наш код выглядит так:

class Car{
carBuildingRequirements requirements;
Car(this.requirements);
}
class carBuildingRequirements{
String engine;
String tires;
int fuel;
carBuildingRequirements(this.engine, this.tires, this.fuel);
}

Итак, у нас есть тип carBuildingRequirements с именем переменной requirements, и это будет зависимость в Конструктор >Car с синтаксическим сахаром.

Уф, довольно много работы, ну, мы почти закончили.

Таким образом, в основном методе экземпляр Car требует новых аргументов, поэтому мы создаем здесь экземпляр carBuildingRequirements. При этом наш основной метод выглядит так.

main(){
Car bugattiCar = new Car(new carBuildingRequirements(‘3 cylinder’, ‘durex tires’, 20));
print(bugattiCar.requirements.engine);
}

Поэтому, когда мы создаем автомобиль, мы создаем требования к зданию, и благодаря этому у нас больше гибкости в нашем коде.

Давайте создадим teslaCar вместе с bugattiCar и посмотрим, как внедрение зависимостей делает наш код более гибким.

main(){
//Bugatti car
Car bugattiCar =
new Car(new carBuildingRequirements(‘3 cylinder’, ‘durex tires’, 20));
print(‘Bugatti car requires ‘
‘${bugattiCar.requirements.engine},’
‘ four ${bugattiCar.requirements.tires}’
‘ and ${bugattiCar.requirements.fuel}’
‘ liters of fuel to function well.\n’);
//Tesla Car
Car teslaCar =
new Car(new carBuildingRequirements(‘8 cylinder’, ‘gold tires’, 80));
print(‘Tesla car requires ‘
‘${teslaCar.requirements.engine},’
‘ four ${teslaCar.requirements.tires}’
‘ and ${teslaCar.requirements.fuel}’
‘ liters of fuel to function well\n’);
}
class Car{
carBuildingRequirements requirements;
Car(this.requirements);
}
class carBuildingRequirements{
String engine;
String tires;
int fuel;
carBuildingRequirements(this.engine, this.tires, this.fuel);
}

Здорово!!! , мы все знаем, как работает внедрение зависимостей, и позже мы рассмотрим, как его можно использовать в приложении angular dart.

Первоначально опубликовано на medium.com 26 ноября 2018 г.