Dependency Injection: Принцип. Паттерн. Контейнер
Просто о NET | создано: 07.11.2021 | опубликовано: 07.11.2021 | обновлено: 13.01.2024 | просмотров: 13028
Довольно запутанно на первый взгляд выглядит эта троица: Принцип. Паттерн. Контейнер. Если с контейнером более или менее всё понятно, то остальные термины требуют объяснения.
Определения
Для начала давайте немного определимся с тем, что обозначают данные термины. Начнем с 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 обхектов.
Заключение
Все описанные выше понятия очень сильно переплетаются, и нужно чётко понимать, что для чего. Особенно часто вопросы про зависимости звучат на собеседованиях.