Лекция
Привет, Вы узнаете о том , что такое внедрение зависимости dependency injection инъекция зависимости, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое внедрение зависимости dependency injection инъекция зависимости , настоятельно рекомендую прочитать все из категории Разработка программного обеспечения и информационных систем.
Внедрение зависимости (англ. Dependency injection, DI) — процесс предоставления внешней зависимости программному компоненту. Является специфичной формой «инверсии управления» (англ. Inversion of control, IoC), когда она применяется к управлению зависимостями. В полном соответствии с принципом единой обязанности объект отдает заботу о построении требуемых ему зависимостей внешнему, специально предназначенному для этого общему механизму[1].
JNDI-запросы сервиса, когда объект запрашивает сервис по имени, реализуют внедрение зависимости лишь частично.
При настоящем внедрении зависимости объект пассивен и не предпринимает вообще никаких шагов для выяснения зависимостей, а предоставляет для этого сеттерыи/или принимает своим конструктором аргументы, посредством которых внедряются зависимости[1].
Работа фреймворка, обеспечивающая внедрение зависимости, описывается следующим образом. Об этом говорит сайт https://intellect.icu . Приложение, независимо от оформления, исполняется внутри контейнера IoC, предоставляемого фреймворком. Часть объектов в программе по-прежнему создается обычным способом языка программирования, часть создается контейнером на основе предоставленной ему конфигурации.
Условно, если объекту нужно получить доступ к определенному сервису, объект берет на себя ответственность за доступ к этому сервису: он или получает прямуюссылку на местонахождение сервиса, или обращается к известному «сервис-локатору» и запрашивает ссылку на реализацию определенного типа сервиса. Используя же внедрение зависимости, объект просто предоставляет свойство, которое в состоянии хранить ссылку на нужный тип сервиса; и когда объект создается, ссылка на реализацию нужного типа сервиса автоматически вставляется в это свойство ( поле ), используя средства среды.
Внедрение зависимости более гибко, потому что становится легче создавать альтернативные реализации данного типа сервиса, а потом указывать, какая именно реализация должна быть использована в, например, конфигурационном файле, без изменений в объектах, которые этот сервис используют. Это особенно полезно вюнит-тестировании, потому что вставить реализацию «заглушки» сервиса в тестируемый объект очень просто.
С другой стороны, излишнее использование внедрения зависимостей может сделать приложения более сложными и трудными в сопровождении: так как для понимания поведения программы программисту необходимо смотреть не только в исходный код , а еще и в конфигурацию, а конфигурация, как правило, невидима для IDE, которые поддерживают анализ ссылок и рефакторинг , если явно не указана поддержка фреймворков с внедрениями зависимостей.
При использовании внедрения зависимостей, как правило, существует конфигурационный механизм или архитектура, которая определяет целесообразность выбора той или иной реализации в зависимости от поставленных целей.
public interface ICar {
public float getSpeed();
public void setPedalPressure(final float PEDAL_PRESSURE);
}
public interface IEngine {
public float getEngineRotation();
public void setFuelConsumptionRate(final float FUEL_FLOW);
}
public class DefaultEngineImpl implements IEngine
{
private float engineRotation = 0;
public float getEngineRotation()
{
return engineRotation;
}
public void setFuelConsumptionRate(final float FUEL_FLOW)
{
engineRotation = …;
}
}
public class DefaultCarImpl implements ICar
{
private IEngine engine = new DefaultEngineImpl();
public float getSpeed()
{
return engine.getEngineRotation()*…;
}
public void setPedalPressure(final float PEDAL_PRESSURE)
{
engine.setFuelConsumptionRate(…);
}
}
public class MyApplication
{
public static void main(String[] args)
{
ICar car = new DefaultCarImpl();
car.setPedalPressure(5);
float speed = car.getSpeed();
System.out.println("Speed of the car is " + speed);
}
}
public class DefaultCarImpl implements ICar {
private IEngine engine;
public DefaultCarImpl(final IEngine engineImpl) {
engine = engineImpl;
}
public float getSpeed() {
return engine.getEngineRotation()*…;
}
public void setPedalPressure(final float PEDAL_PRESSURE) {
engine.setFuelConsumptionRate(…);
}
}
public class CarFactory {
public static ICar buildCar() {
return new DefaultCarImpl(new DefaultEngineImpl());
}
}
public class MyApplication {
public static void main(String[] args) {
ICar car = CarFactory.buildCar();
car.setPedalPressure(5);
float speed = car.getSpeed();
System.out.println("Speed of the car is " + speed);
}
}
<service-point id="CarBuilderService">
<invoke-factory>
<construct class="Car">
<service>DefaultCarImpl</service>
<service>DefaultEngineImpl</service>
</construct>
</invoke-factory>
</service-point>
/** Неявная реализация **/
public class MyApplication {
public static void main(String[] args) {
Service service = (Service)DependencyManager.get("CarBuilderService");
ICar car = (ICar)service.getService(Car.class);
car.setPedalPressure(5);
float speed = car.getSpeed();
System.out.println("Speed of the car is " + speed);
}
}
пример на PHP Laravel
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class UserController extends Controller
{
/**
* Store a new user.
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
$name = $request->input('name');
//
}
}
Выводы из данной статьи про внедрение зависимости dependency injection инъекция зависимости указывают на необходимость использования современных методов для оптимизации любых систем. Надеюсь, что теперь ты понял что такое внедрение зависимости dependency injection инъекция зависимости и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Разработка программного обеспечения и информационных систем
Из статьи мы узнали кратко, но содержательно про внедрение зависимости dependency injection инъекция зависимости
Комментарии
Оставить комментарий
Разработка программного обеспечения и информационных систем
Термины: Разработка программного обеспечения и информационных систем