Як інверсія управління пов'язана з інверсією залежності


12

У багатьох статтях по всьому Інтернету терміни Принцип інверсії контролю та залежності залежно змішуються і використовуються як синоніми (подальше плутанину застосовується за допомогою інструментів, які називаються "DI-контейнери" та "контейнери IoC"). Стаття у Вікіпедії робить гарну роботу, намагаючись пояснити, що IoC - це не те саме, що DI:

інверсія управління (IoC) описує дизайн, в якому написані на замовлення частини комп'ютерної програми отримують потік управління з загальної бібліотеки для багаторазового використання

Отже, DIP полягає в тому, щоб ваші модулі залежали від абстракцій, а не конкретних реалізацій.

І IoC збирається контролювати потік вашої програми в окремий модуль. І одна з речей, за допомогою якої ви можете зробити цей модуль, - це вирішити залежності під час виконання.

Ця різниця здається справедливою, але я ніколи не бачив, щоб хтось згадував про будь-які інші програми принципу IoC, окрім вирішення залежності. Визначення Вікіпедії досить широке, і, схоже, ви могли зробити набагато більше з модулем, який може робити дзвінки у ваш спеціальний код на основі його конфігурації та певної внутрішньої логіки.

Отже, ось кілька питань, яких я поки не можу зрозуміти:

  • Яке фактичне відношення між IoC та DIP? Чи завжди IoC служить засобом впровадження DIP?
  • Чому інструменти для вирішення залежності називаються як DI-, так і IoC-контейнерами? Це означає, що DI та IoC - це одне і те ж.

Примітка . Це запитання не є дублікатом у чому різниця між DI та IoC , оскільки останній запитує про ін'єкцію залежності, а не про інверсію залежності.


Можливий дублікат У чому різниця між DI та IoC?
гнат

@gnat, ні це не так, будь ласка, дивіться мою редакцію
Andre Borges

погодьтесь, я пропустив це вибачення
гнат

2
ІМО, проста відповідь - «вони однакові». IoC - інша назва інверсії залежності, і обидва є способом досягнення ін'єкції залежності. Я розглядаю "інверсію залежності" як глибоко непомітний термін, оскільки це занадто легко сплутати з ін'єкцією. Отже, існує DI (ін'єкція), а IoC - це спосіб досягти інверсії залежностей / контролю за допомогою ін'єкції.
Девід Арно

Відповіді:


6

На сайті Мартіна Фаулера є чудова стаття, в якій є розділ про різницю між DIP, DI та IoC . Суть його (як скопійовано з цього сайту) є

DI - це те, як один об'єкт набуває залежність. Коли залежність надається зовні, то система використовує DI. IoC - це те, хто ініціює виклик. Якщо ваш код ініціює виклик, це не IoC, якщо контейнер / система / бібліотека передзвонює в код, який ви надали, це IoC.

DIP, з іншого боку, стосується рівня абстрагування повідомлень, що надсилаються з вашого коду на те, що він дзвонить. Безумовно, використання DI чи IoC з DIP має тенденцію бути більш виразною, потужною та вирівняною по домену, але загальна проблема стосується різних розмірів чи сил. DI - про проводку, IoC - про напрямок, а DIP - про форму.


2
IoC - це про те, хто ініціює виклик - хто запроваджує дзвінок до чого? Якщо я напишу ISomeInterface object = container.Resolve<ISomeInterface>()це IoC чи ні?
Андре Борхес

1
Те, що ви пишете, - це реалізація в шаблоні пошуку служб. Це також IoC. Не IoC - це об'єкт ISomeInterface = новий MyClass (). Отже, заклик, який мається на увазі, - це "заклик до інстанції" (або хто називає "новий").
Sjoerd222888

1
"DIP, з іншого боку, стосується рівня абстрагування в повідомленнях, що надсилаються з вашого коду на те, що він викликає." Це звучить як дурниця для мене. Де в цьому інверсія? Він описує абстракцію залежності, а не інверсію.
Девід Арно

@DavidArno, ти хочеш сказати, що ми не можемо довіряти веб-сайту Мартіна Фаулера?
holdenmcgrohen

@holdenmcgrohen, це його думка щодо речей. Тільки тому, що це Мартін Фаулер, це не робить фактом. Іноді він помиляється IMO, наприклад, щодо "моделі даних про анемію". Інший час його дуже проникливий. З цього приводу я думаю, що він теж помиляється, оскільки це не має сенсу.
Девід Арно
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.