Внедрение зависимостей (dependency injection)
Коротко: При внедрении зависимостей объекту передаётся то, что ему нужно, снаружи, вместо того чтобы создавать это самому, — обычно через конструктор.
Подробнее: В результате класс зависит только от интерфейса, а не от конкретной реализации. Конкретный вариант выбирается в одном центральном месте. Это снижает связанность, делает код заменяемым и лишь тогда по-настоящему тестируемым (модульные тесты получают моки вместо настоящих баз данных).
Подробности
# без DI: жёсткая привязка
class ReportСм. также: SOLID, интерфейс, модульный тест, абстракция