Этот вопрос проверяет понимание разницы между архитектурным принципом и механизмом внедрения зависимостей.
Dependency Inversion — это принцип, который говорит, что модули высокого уровня не должны зависеть от конкретных реализаций. Они должны зависеть от абстракций. Dependency Injection — это способ реализовать этот принцип, передавая зависимости в конструктор, методы или свойства. DI — это техника, а DIP — фундаментальная архитектурная идея. DIP можно соблюдать и без DI-фреймворков, но DI помогает сделать это удобнее.
Определение: Высокоуровневые модули не должны зависеть от низкоуровневых. Оба должны зависеть от абстракций.
Смысл — отвязать логику от конкретных классов, чтобы код был гибким.
Пример нарушения:
class EnemySpawner
{
private Orc orc = new Orc(); // зависимость от конкретной реализации
}
Пример соблюдения:
class EnemySpawner
{
private readonly IEnemy enemy;
public EnemySpawner(IEnemy enemy) => this.enemy = enemy;
}
Определение: Техника передачи зависимостей объекту извне — через конструктор, метод или свойство.
Ди вводит зависимости, а не создаёт их внутри.
Пример DI:
var spawner = new EnemySpawner(new Orc());
DIP описывает, как правильно проектировать архитектуру
DI описывает, как подавать зависимости в классы
DIP можно соблюдать даже без DI-контейнеров.
Можно вручную внедрять зависимости через конструктор.
Используй DIP для построения гибкой архитектуры, а DI — как удобный инструмент соблюдения DIP.