Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Внедрение зависимости (Dependency injection) инъекция зависимости

Лекция



Привет, Вы узнаете о том , что такое внедрение зависимости dependency injection инъекция зависимости, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое внедрение зависимости dependency injection инъекция зависимости , настоятельно рекомендую прочитать все из категории Разработка программного обеспечения и информационных систем.

Внедрение зависимости (англ. Dependency injection, DI) — процесс предоставления внешней зависимости программному компоненту. Является специфичной формой «инверсии управления» (англ. Inversion of control, IoC), когда она применяется к управлению зависимостями. В полном соответствии с принципом единой обязанности объект отдает заботу о построении требуемых ему зависимостей внешнему, специально предназначенному для этого общему механизму[1].

JNDI-запросы сервиса, когда объект запрашивает сервис по имени, реализуют внедрение зависимости лишь частично.

 

Содержание

 
  • 1Настоящее внедрение зависимости
  • 2Принцип работы
  • 3Примеры кода
    • 3.1Пример кода на Java
      • 3.1.1Без использования dependency injection
      • 3.1.2Внедрение зависимости вручную
      • 3.1.3Внедрение зависимости при помощи фреймворка
  • 4Вау!! 😲 Ты еще не читал? Это зря!
  • 5Примечания
  • 6Литература
  • 7Ссылки

 

Настоящее внедрение зависимости 

При настоящем внедрении зависимости объект пассивен и не предпринимает вообще никаких шагов для выяснения зависимостей, а предоставляет для этого сеттерыи/или принимает своим конструктором аргументы, посредством которых внедряются зависимости[1].

Принцип работы 

 

Работа фреймворка, обеспечивающая внедрение зависимости, описывается следующим образом. Об этом говорит сайт https://intellect.icu . Приложение, независимо от оформления, исполняется внутри контейнера IoC, предоставляемого фреймворком. Часть объектов в программе по-прежнему создается обычным способом языка программирования, часть создается контейнером на основе предоставленной ему конфигурации.

Условно, если объекту нужно получить доступ к определенному сервису, объект берет на себя ответственность за доступ к этому сервису: он или получает прямуюссылку на местонахождение сервиса, или обращается к известному «сервис-локатору» и запрашивает ссылку на реализацию определенного типа сервиса. Используя же внедрение зависимости, объект просто предоставляет свойство, которое в состоянии хранить ссылку на нужный тип сервиса; и когда объект создается, ссылка на реализацию нужного типа сервиса автоматически вставляется в это свойство ( поле ), используя средства среды.

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

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

Примеры кода 

При использовании внедрения зависимостей, как правило, существует конфигурационный механизм или архитектура, которая определяет целесообразность выбора той или иной реализации в зависимости от поставленных целей.

Пример кода на Java 

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);
}

Без использования dependency injection 

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 инъекция зависимости
создано: 2016-05-01
обновлено: 2021-03-13
195



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей

Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Разработка программного обеспечения и информационных систем

Термины: Разработка программного обеспечения и информационных систем