Ответ
Внедрение зависимостей (Dependency Injection, DI) — это паттерн проектирования, при котором зависимости (объекты, необходимые для работы) передаются в класс извне, а не создаются внутри него. Это конкретная реализация более общего принципа инверсии зависимостей (Dependency Inversion Principle, DIP) из SOLID.
Основная цель — уменьшить связанность (coupling) между компонентами системы, что упрощает их тестирование, переиспользование и замену.
Пример на Python:
Вместо того чтобы UserService
сам создавал подключение к базе данных, мы передаем ему готовый объект db
.
# Абстракция, от которой мы будем зависеть
from abc import ABC, abstractmethod
class Database(ABC):
@abstractmethod
def save(self, data: dict):
pass
# Конкретная реализация
class PostgreSQLDatabase(Database):
def save(self, data: dict):
print(f"Saving {data} to PostgreSQL")
# Класс, использующий зависимость
class UserService:
# Зависимость внедряется через конструктор
def __init__(self, db: Database):
self._db = db
def create_user(self, user_data: dict):
print("Creating user...")
self._db.save(user_data)
# Использование:
# Мы "внедряем" конкретную реализацию базы данных в сервис
pg_db = PostgreSQLDatabase()
user_service = UserService(db=pg_db)
user_service.create_user({"name": "Alice"})
Ключевые области применения:
- Веб-фреймворки: FastAPI активно использует DI для обработки запросов и зависимостей. Django и Flask также применяют этот принцип, хотя и менее явно.
- Тестирование: Позволяет легко подменять реальные зависимости (например, базу данных) на моки (mock-объекты) для изоляции тестируемого кода.
- IoC-контейнеры: Специализированные библиотеки (
dependency-injector
в Python), которые управляют жизненным циклом объектов и их зависимостей.