Dependency Injection: Принцип. Паттерн. Контейнер

Просто о NET | создано: 11/7/2021 | опубликовано: 11/7/2021 | обновлено: 11/17/2022 | просмотров: 2771

Довольно запутанно на первый взгляд выглядит эта троица: Принцип. Паттерн. Контейнер. Если с контейнером более или менее всё понятно, то остальные термины требуют объяснения.

Определения

Для начала давайте немного определимся с тем, что обозначают данные термины. Начнем с Dependency Inversion Principle (DIP).

Dependency Inversion Principle (DIP)

Итак, Dependency Inversion Principle (DIP) - это инверсия зависимостей, которая заключается в разведении конкретных классов путем предотвращения прямой ссылки этих классов друг на друга. DIP в первую очередь заботится о том, чтобы класс зависел только от абстракции более высокого уровня. Например, интерфейсы существуют на более высоком уровне абстракции, чем конкретный класс. DIP напрямую не связан с внедрением зависимостей, хотя шаблон внедрения зависимостей является одним из многих методов, которые могут помочь обеспечить уровень НЕсвязанности, необходимый для того, чтобы избежать зависимости от низкоуровневых деталей и связи с другими конкретными классами.

Инверсия зависимостей часто более явна в статически типизированных языках программирования, таких как C# или Java, потому что эти языки обеспечивают строгую проверку типов имен переменных. С другой стороны, Dependency Inversion уже пассивно доступна в динамических языках, таких как Python или JavaScript, поскольку переменные в этих языках не имеют каких-либо определенных ограничений типа.

Dependency Injection Pattern

Паттерн внедрение зависимостей (Dependency Injection Pattern) — это шаблон проектирования, который применяет принцип IoC, чтобы гарантировать, что класс абсолютно никаким образом не участвует в создании экземпляра зависимого класса, и тем более не управляет его жизненным циклом (lifetime), то есть временем существования объектов. Другими словами, забота о создании класса и наполнение переменных его экземпляра, который "пришел" через конструктор, или через метод - целиком и полностью лежит на платформе. То есть, где-то на более высоком уровне. Говоря про Dependency Injection Pattern нельзя не сказать про Inversion of Сontrol, который был упомянут выше.

Inversion of control

Что гласит Wikipedia:

Wiki: Инверсия управления (англ. Inversion of Control, IoC) — важный принцип объектно-ориентированного программирования, используемый для уменьшения зацепления (связанности) в компьютерных программах. Также архитектурное решение интеграции, упрощающее расширение возможностей системы, при котором поток управления программы контролируется фреймворком.

Реализовать инверсию управления, то есть развернуть зависимости,  можно двумя способами: 1) Внедрение непосредственно зависимостей; 2) Внедрение ServiceLocator, который может разрешать (resolve) зависимости. Внедрение зависимости используется во многих фреймворках, которые называются IoC-контейнерами. Примеры таких контейнеров можно посмотреть на странице сравнения их производительности

Dependency Injection Container

Dependency Injection (DI) Contaier - это инструмент, который может решать (resolve) зависимости для их внедрения. Говоря простыми словами, это "черный ящик", в котором можно зарегистрировать классы (интерфейсы и их реализации) для дальнейшего их решения (resolve) в нужных местах, например в конструкторах. Кстати, надо сказать, что внедрение зависимостей возможно не только через конструктор, но и через методы и свойства. Хотя внедрение через конструктор самое распространное внедрение.

Для чего нужен DI-контейнер:

  • Создание экземпляров обхектов, то есть решение зависимостей, в том числе и иерархических.
  • Управление жизненным циклов объектов (lifetime).
  • Доступ из "любого" места в программе, практически в любом конструкторе.

Надо сказать, что я не понимаю, как я раньше жил без DI-контейнер. Теперь без него никуда. Даже в простых программах его использование дает значительную выгода, даже только при управлении lifetime обхектов.

Заключение

Все описанные выше понятия очень сильно переплетаются, и нужно чётко понимать, что для чего. Особенно часто вопросы про зависимости звучат на собеседованиях.

Видео

Ссылки

Стать спонсором:
https://www.youtube.com/channel/UCWqjyIe9-ukFyG7I3eMVt4A/join

Благодарности помощь каналу принимаются:
https://www.calabonga.net/site/thanks