dependency inversion vs dependency injection
Dependency Injection (DI) — это набор паттернов и принципов разработки програмного обеспечения, которые позволяют писать слабосвязный код. По мнению М.Фаулера, DI является разновидностью более глобального принципа инверсии управления (IoC), также известного как “Hollywood Principle”
Инверсия зависимостей против инъекции зависимостей
В литературе встречаются два разных понятия Инверсия управления и Принцип инверсии зависимостей, которые сформулированы одинакаво:
- Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций.
- Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
В чем состоит разница?
Inversion of Control — это общий термин, который характеризует архитектуру ПО. Применяется обычно к фреймворкам — инверсия управления является одной из характеристик.
Фреймворки предоставляют точки подключения, в которых вы можете писать свой код. Но при этом общим выполнением программы по-прежнему управляет фреймворк, время от времени вызывая ваш код. Инверсия заключается в том, что в отличии от традиционного подхода не вы вызываете библиотечный код, а библиотечный код вызывает вас. Примерами могут являться ASP.NET и WPF с их событиями.
При этом принцип инверсии управления может использоваться и в более мелком масштабе. Например, есть слой логики (BLL) и доступа к данным (DAL). Общеизвестно, что DAL не может обращаться к BLL. Но иногда возникает потребность на уровне DAL выполнить некий код, который должен принадлежать к BLL. В таком случае в DAL заводится некоторый интерфейс, этот интерфейс реализуется на уровне BLL, и экземпляр конкретной реализации передается из BLL в DAL. Такой пример, в частности, согласуется с DIP.
Dependency Inversion Principle дает рекомендации о том, какими должны быть зависимости. Это как раз то, что вы процитировали:
- Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций.
- Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
Вы также могли слышать о Dependency Injection. Внедрение зависимостей является связующим звеном между IoC и DIP. Это один из способов реализации инверсии управления.
Лучше почитайте английскую Вики про IoC и DIP, там намного лучше все объяснено. Думаю, даже с помощью Гугл транслейта это будет полезнее, чем статьи на русской Вики.
В качестве русскоязычного источника могу порекомендовать статью DI vs. DIP vs. IoC от Сергея Теплякова. Возможно он даже зайдет в этот вопрос и объяснит все как следует :).
а не объясните ли вы по теме – что такое “модули верхних уровней” и “модули нижних уровней”, например в контексте web-фреймворка?
|
я бы сказал, что модули верхних уровней — это модули, содержащие бизнес-логику и интерфейс, а модули нижних уровней — модули, содержащие технические детали (например, обращение к БД или к стороннему сервису). Под “не должны зависеть” подразумеваются детали. Т.е. модуль бизнес-логики естественно использует модуль доступа к БД, но при этом в него не должны просачиваться детали имплементации (например, что это за БД и какой индекс надо использовать для выполнения запроса)