Принцип DIP из SOLID и Autowiring из DI-контейнеров?
======================================================

 Принцип DIP гласит: зависимости должны быть на абстракциях, а не от конкретной реализации.  

  

Например такой код:  

```
public function __construct(LoggerInterface $logger) { }
```
  

Зависимость от интерфейса.  

  

При использовании DI-контейнеров с autowiring - работать не будет. Для работы автовайринга нужно, чтобы был указан конкретный класс в зависимости.  

  

Объясните пожалуйста, что я не так понял? Или почему вижу противоречие в принципе DIP и инструмента для упрощения работы с зависимостями? 

 Dependency injection - это когда в класс A мы передаем класс B через конструктор или сеттер, что бы он с ним работал, а не создавал его в своих нутрях.  

Dependency Inversion - это когда мы в классе A работаем не с конкретной реализацией, а с интерфейсами: указываем интерфейсы в конструкторе, в методах, в возвращаемых типах и т.д.  

Это два разных понятия, которые иногда объединяют в одно, и иногда их путают.  

Так вот, autowiring - это про Dependency injection, а D в solid - это про Dependency Inversion. Одно другому не мешает и не нарушает. 

 Как это не будет? Может быть вы не правильно используете или не знаете как использовать?  

  

В DI контейнере мы «привязываем» класс, который реализует интерфейс. Таким образом везде, где есть этот интерфейс будет работать созданный и «привязанный» нами класс.  

  

Вроде бы там достаточно просто и понятно. 

 У Вас 2 варианта:  

1. Пытаетесь исправить чьи-то ошибки.  

2. Думаете своей головой.  

  

Я выбрал - 2-й.