Согласно статье, написанной Мартином Фаулером, инверсия управления - это принцип, при котором поток управления программы инвертируется: вместо программиста, управляющего потоком программы, внешние источники (инфраструктура, службы, другие компоненты) принимают на себя управление Это. Как будто мы подключаем что-то к чему-то другому. Он привел пример с EJB 2.0:
Например, интерфейс Session Bean определяет ejbRemove, ejbPassivate (сохраняется во вторичном хранилище) и ejbActivate (восстанавливается из пассивного состояния). Вы не можете контролировать, когда эти методы вызываются, только то, что они делают. Контейнер звонит нам, мы не называем это.
Это приводит к разнице между фреймворком и библиотекой:
Инверсия управления - это ключевая часть того, что отличает фреймворк от библиотеки. Библиотека - это, по сути, набор функций, которые вы можете вызывать, в наши дни обычно организованные в классы. Каждый вызов выполняет некоторую работу и возвращает управление клиенту.
Я думаю, точка зрения, что DI - это IOC, означает, что зависимость объекта инвертирована: вместо этого он управляет своими собственными зависимостями, жизненным циклом... что-то другое делает это за вас. Но, как вы сказали мне о DI руками, DI не обязательно является МОК. У нас все еще может быть DI и нет МОК.
Однако в этой статье (из pococapsule, другой платформы IOC для C/C++) предлагается, что благодаря IOC и DI контейнеры IOC и структуры DI намного превосходят J2EE, поскольку J2EE смешивает код инфраструктуры в компоненты, таким образом не превращая его в Обычный Старый Java/C++ Объект (POJO/POCO).
Инверсия управляющих контейнеров, отличных от шаблона внедрения зависимостей (ссылка на архив)
Дополнительное чтение, чтобы понять, в чем проблема со старой платформой разработки на основе компонентов, что приводит ко второму документу выше: почему и что такое Inversion of Control (ссылка на архив)
Мой вопрос: что такое МОК и ДИ? Я сбит с толку. Основанный на pococapsule, IOC является чем-то более значительным, чем просто инвертирование управления между объектами или программистами и средами.