На рівні класу це легко.
"Ін'єкція залежності" просто відповідає на питання "як я знайду своїх співробітників" з "вони підштовхуються до вас - вам не доведеться йти і отримувати їх самостійно". (Це схоже на - але не те саме, що "Інверсія управління", де на запитання "як я замовляю свої операції над своїми входами?" Є аналогічна відповідь).
Тільки вигоди , які мають ваші співробітники штовхнули вас, що дозволяє клієнтський коду використовувати клас , щоб скласти граф об'єкта , який відповідає його нинішній потребі ... Ви не довільно попередньо визначили форму і мінливість графи приватно прийняття рішення конкретні типи та життєвий цикл ваших співробітників.
(Усі ці інші переваги, засвідчуваність, нещільне з'єднання тощо, значною мірою випливають із використання інтерфейсів, а не стільки від залежності-ін'єкційності, хоча DI природно сприяє використанню інтерфейсів).
Варто зауважити, що, якщо ви не уникаєте інстанції власних співпрацівників, ваш клас повинен, таким чином, отримати своїх співпрацівників з конструктора, властивості або методу-аргументу (цей останній варіант, до речі, часто не помічається) не завжди має сенс співпрацівники класу бути частиною його "стану").
І це добре.
На рівні програми ...
Стільки для перегляду речей у класі. Скажімо, у вас є купа занять, які слідують правилу "не інстанціювати власних співробітників", і хочете зробити заявку на них. Найпростіша річ - скористатися старим хорошим кодом (дійсно корисним інструментом для виклику конструкторів, властивостей та методів!), Щоб скласти потрібний графік об'єкта та вкинути на нього деякий вклад. (Так, деякі з цих об’єктів у вашому графіку самі будуть об'єктами-фабриками, які передані в якості співпрацівників іншим довгоживучим об'єктам у графіку, готові до експлуатації ... ви не можете попередньо сконструювати кожен об’єкт! ).
... ваша потреба "гнучко" налаштувати об'єкт-графік вашого додатка ...
Залежно від інших ваших цілей (не пов'язаних з кодом), ви можете надати кінцевому користувачеві деякий контроль над таким чином розгорнутим графіком об'єкта. Це призводить вас до тієї чи іншої схеми конфігурації, будь то текстовий файл вашого власного дизайну з деякими парами імен / значень, XML-файл, спеціальна DSL, декларативна мова опису графа, наприклад YAML - вкрай необхідна мова сценаріїв, наприклад, JavaScript або щось інше, відповідне завданням. Що б не потрібно було скласти дійсний графік об'єкта таким чином, щоб відповідати потребам ваших користувачів.
... може бути значною конструкторською силою.
За найбільш крайніх обставин цього типу, ви можете обрати дуже загальний підхід і надати кінцевим користувачам загальний механізм "підключення" об'єкта-графіка, який вони вибирають, і навіть дозволити їм надати конкретну реалізацію інтерфейсів для час виконання! (Ваша документація - це блискуча коштовність; ваші користувачі дуже розумні, знайомі як мінімум з грубими обрисами об'єктного графіка вашої програми, але компілятор не підходить). Цей сценарій теоретично може виникнути в деяких ситуаціях на підприємстві.
У цьому випадку ви, мабуть, володієте декларативною мовою, яка дозволяє вашим користувачам виражати будь-який тип, склад об’єктного графіка таких типів та палітру інтерфейсів, які міфічний кінцевий користувач може змішувати та співставляти. Щоб зменшити когнітивне навантаження на своїх користувачів, ви віддаєте перевагу підходу "конфігурація за допомогою конвенції", щоб вони мали лише наступати і перебігати об'єкт-графік-фрагмент, що цікавить, а не боротися з усією справою.
Ти бідна дерно!
Оскільки ви не хотіли писати все це самостійно (але серйозно, ознайомтеся з прив’язкою YAML для своєї мови), ви використовуєте якісь рамки DI.
Залежно від зрілості цього фреймворку, можливо, у вас не буде можливості використовувати конструктор-інжекцію, навіть коли це має сенс (колабораціоністи не змінюються протягом життя об’єкта), тим самим змушуючи вас використовувати програму Setter Injection (навіть коли колабораціоністи не змінюються протягом життя об’єкта, і навіть коли насправді немає логічної причини, чому всі конкретні реалізації інтерфейсу повинні мати колабораціоністів певного типу). Якщо це так, ви зараз перебуваєте в пеклі сильної зв'язку, незважаючи на те, що старанно "використовували інтерфейси" у всій своїй кодовій базі - жах!
Будемо сподіватися, що ви використовували рамку DI, яка надає вам можливість конструкторської інжекції, і ваші користувачі лише трохи знущаються на вас за те, що не витрачаєте більше часу на роздуми про конкретні речі, необхідні для їх налаштування, і надаючи їм інтерфейс, що більше відповідає завданням під рукою. (Хоча, щоб бути справедливим, ви, мабуть, намагалися придумати спосіб, але JavaEE вас підвів, і вам довелося вдатися до цього жахливого злому).
Завантаження
Ні в якому разі ви ніколи не використовуєте Google Guice, який дає кодеру спосіб позбутися завдання складання об'єкт-графіка з кодом ..., написавши код. Арг!