Я изучаю spring. Я понял инъекцию зависимости. В некотором месте я также вижу, что это называется инверсией зависимостей. Я понял, почему это называется инъекцией, но что подразумевается под "инверсией"? Какая зависимость - это фактически инвертирование?
Что означает "инверсия" в инверсии зависимостей
Ответ 1
Хороший вопрос - слово inversion
несколько удивительно (так как после применения DIP, модуль зависимостей нижнего уровня, очевидно, t теперь depend
на модуле вызывающего абонента более высокого уровня: либо вызывающий, либо зависимый теперь более слабо связаны через дополнительную абстракцию).
Ссылаясь на Robert C Martin исходный источник
Можно спросить, почему я использую слово "инверсия". Честно говоря, это связано с тем, что более традиционные методы разработки программного обеспечения, такие как структурированный анализ и дизайн, имеют тенденцию создавать программные структуры, в которых модули высокого уровня зависят от модулей низкого уровня и в которых абстракции зависят от деталей. На самом деле одной из целей этих методов является определение иерархии подпрограмм, которая описывает, как модули высокого уровня выполняют вызовы модулям низкого уровня.... Таким образом, структура зависимостей хорошо спроектированной объектно-ориентированной программы "инвертируется" относительно структуры зависимостей, которая обычно является результатом традиционных процедурных методов.
Один момент, который следует отметить при чтении бумаги дяди Боба на DIP, - это то, что С++ не (и в момент написания, но не имеет) имеют интерфейсы, поэтому достижение этой абстракции в С++ обычно реализуется посредством абстрактного/чистого виртуального базового класса, тогда как в Java или С# абстракция для ослабления связи обычно заключается в развязывании путем абстрагирования интерфейса от зависимости и связывания модуля более высокого уровня (s ) к интерфейсу.
Edit Просто уточнить:
"В некотором месте я также вижу, что он называется инверсией зависимостей"
Обратите внимание, что Dependency Injection (DI) является ОДНОЙ из возможных реализаций для достижения принципа инверсии зависимостей (DIP) - "D" в принципах дизайна SOLID, поэтому DI
и DIP
не являются полностью взаимозаменяемыми.
Другие реализации DIP включают шаблон локатора службы (который в настоящее время часто рассматривается как анти-шаблон); и Плагин.
Ответ 2
Инверсия: Инвертирование управления зависимостями из приложения в контейнер (например, Spring).
Инъекция зависимостей:
Вместо того, чтобы писать шаблон factory, как насчет инъекции объекта непосредственно в класс клиента. Поэтому позвольте классу клиентов ссылаться на интерфейс, и мы должны иметь возможность вводить конкретный тип в класс клиента. С этим классу клиента не нужно использовать новое ключевое слово и полностью отделено от конкретных классов.
Как насчет инверсии управления (IoC)?
В традиционном программировании поток бизнес-логики определяется объектами, которые статически назначаются друг другу. С инверсией управления поток зависит от графа объекта, который создается экземпляром ассемблера и становится возможным благодаря объектным взаимодействиям, определяемым посредством абстракций. Процесс связывания достигается посредством инъекции зависимостей, хотя некоторые утверждают, что использование локатора службы также обеспечивает инверсию управления.
Инверсия управления в качестве ориентира для проектирования служит для следующих целей:
- Существует развязка выполнения определенной задачи из реализация.
- Каждый модуль может сосредоточиться на том, для чего он предназначен.
- Модули не делают никаких предположений о том, что делают другие системы, но полагаются на их контракты.
- Замена модулей не влияет на другие модули.
Для получения дополнительной информации смотрите:
Шаблон проектирования - инверсия управления и инъекции зависимостей.