Я не думаю, что вы получите авторитетный ответ на этот вопрос, потому что термин «IoC» отчасти перегружен, и сказать «единственное истинное значение IoC - это…» является своего рода педантичным.Но я все равно поделюсь своим мнением:)
Инверсия зависимости примерно зависит от абстракции.Рассмотрим класс HelloWorld
, который зависит от IStringWriter
, и класс реализации ConsoleStringWriter
.
Инверсия Control - это когда инфраструктура / инфраструктура вызывает код приложения, а ненаоборотНапример, когда пользователь закрывает приложение WPF, вы не вызываете платформу, оно вызывает событие , на которое вы можете подписаться.
Они часто объединяются. Например, Hibernate зависит от абстракции, определенной его интерфейсом перехватчика , для реализации IoC.С точки зрения Перехватчика, управление инвертировано - Hibernate вызывает Перехватчик.Другой пример, который вы видите повсюду: IHandle<T>
, где T - это Событие, или Команда, или Сообщение - инфраструктура вызывает обработчик в нужное время.
Это сбивает с толку, потому что мы называем их «контейнерами IoC», ноВы можете сделать DI, не делая IoC.Если вы добавляете ConsoleStringWriter
в HelloWorld
, я на самом деле не думаю об этом как о IoC, потому что здесь нет "фреймворка" или "инфраструктуры".Но это потому, что Hello World тривиален - по мере усложнения приложения потребность в IoC возрастает.
См. Также этот вопрос и принятый ответ.