Что такое инъекция зависимостей и как она связана с SOLID
Что проверяют
Отличаете ли вы приём от принципа. Инъекция зависимостей это техника, инверсия зависимостей это правило проектирования, и путаница между ними на собеседовании слышна сразу. Отдельно смотрят, не считаете ли вы, что для DI нужен фреймворк: в Python он не нужен почти никогда.
Как отвечать
DI это способ реализовать инверсию управления: объект не создаёт свои зависимости сам, а получает их снаружи, чаще через конструктор, реже параметром метода или атрибутом.
class UserService:
def __init__(self, repo, now=datetime.utcnow):
self._repo = repo
self._now = nowСвязь с SOLID идёт прежде всего с буквой D: высокоуровневый код зависит от абстракции, а не от конкретной реализации, и сам владеет её описанием. DI лишь даёт механизм подстановки и принцип автоматически не выполняет: если в конструктор приезжает конкретный класс с жёсткой семантикой, зависимость просто переехала на уровень выше, а связанность осталась. Заодно работают O (новая реализация вместо правки старой), L (подставленная реализация обязана держать контракт) и I (узкий протокол подменить проще, чем толстый).
В Python роль абстракции играет протокол по утиной типизации или typing.Protocol, наследование от ABC необязательно. Практическая выгода видна в тестах: репозиторий, часы, генератор идентификаторов передаются фейками, и тест не трогает базу.
Где спотыкаются
Ставят знак равенства между DI и принципом инверсии зависимостей, а потом не могут объяснить, почему передача конкретного класса аргументом ничего не развязала.
Считают DI синонимом контейнера и тащат фреймворк в проект, где хватает конструктора. Обратная крайность тоже встречается: функцию с параметром-функцией не признают инъекцией, хотя это она и есть.
Подменяют инъекцию патчингом: зависимость остаётся глобальной, а в тесте её затирают через mock.patch по пути импорта. Тест зелёный, связанность на месте, и первая же перестановка импортов его ломает. Отдельная ловушка это значение по умолчанию, которое создаёт настоящее подключение прямо на импорте модуля.