Для чого потрібні рамки для введення залежності? [зачинено]


42

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

Здається, це в основному говорить "не оголошувати членів класу" моменти в класі ". Скоріше, щоб екземпляри повинні бути передані і призначені через конструктор; 'вводиться' у клас із стороннього джерела.

Якщо це так просто, як здається, чому нам потрібні такі рамки, як весна або догадка, які реалізують це за допомогою анотацій? Чи пропускаю тут щось фундаментальне? Мені дуже важко зрозуміти, чим користуються рамки ін'єкційних залежностей.

Редагувати: Щодо можливого дублікату, я вважаю, що моє питання є більш унікальним, оскільки це питання про рамки DI взагалі, а не лише про Spring. Spring - це не лише рамки DI, тому є багато причин, через які хтось захотів би використовувати Spring, не пов'язані з DI.



11
Вони корисні для переміщення помилок у час виконання замість часу компіляції.
День

1
@den Чому ми б хотіли це робити? Це, здається, порушує невдачу
ЦЕ ПОТРІБНИЦЯ ПОТРІБНО ДОПОМОГА

Відповіді:


26

Нам не потрібні рамки. Цілком можливо здійснити введення залежності залежно вручну, навіть для відносно великого проекту.

З іншого боку, використання фреймворку полегшує, зокрема, на основі анотацій або автоматичного виявлення залежностей, оскільки це спрощує процес: якщо я вирішу, що мені потрібна нова залежність у класі, все, що мені потрібно зробити, - це додати це до конструктора (або оголосити сеттер) і об'єкт вводиться - мені не потрібно змінювати код інстанції.

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


8
Вдарити цвях по голові. Нам вони не потрібні. Вони просто полегшують життя великим проектам. Чесно кажучи, я вважаю, що рамки більше клопоту, ніж вони коштують для менших проектів. Я б закликав ОП не плутати залежність вприскування з рамками, які її підтримують.
RubberDuck

1
добре сказано. І навіщо винаходити колесо, коли хтось уже зробив приємне і кругле?
jwenting

Саме так. За винятком того, що мені не потрібно міняти будь-який код реєстрації - звичайно, код інстанції немає ;-)
Mathieu Guindon

Це просто схоже на те, що ваші DI бібліотеки смокчуть. Хороші можуть вгадати клас, щоб інстанціювати за допомогою рефлексії.
Флоріан Маргаїн

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

12
  1. Навіщо нам взагалі потрібна ін'єкційна залежність?

    Механізм DI відокремлює виробництво об'єкта від споживання об'єкта. Залежності, необхідні об'єкту, поставляються прозоро зовні. Перевага механізму очевидна: ви можете в будь-який час поміняти залежність, наприклад, використовувати Null Object для цілей тестування.

  2. Як це робиться?

    Існує кілька способів досягнення мети:

    • Введення залежностей за допомогою конструкторської інжекції
    • Ін'єкція через геттер / сетер
    • Інжекційне введення
  3. Чи потрібні рамки DI?

    Ні, зовсім ні. Ви можете просто передати всі екземпляри іншим об'єктам вручну. Якщо у вас невеликий додаток, немає необхідності в пружинному контейнері.

    Але з іншого боку, рамки надають вам допомогу, керуючи об’єктами:

    • Вони допомагають вам з'єднати складні об'єктні відносини. Вам не потрібно писати код котла, щоб генерувати екземпляри та передавати їх відповідним об'єктам

    • Вони допомагають вам контролювати, коли створюється об’єкт: ви можете створювати екземпляри під час завантаження програми, але в деяких випадках ліниве створення - лише за потреби - краще

    • Вони допомагають вам контролювати кількість створених екземплярів: один за час роботи програми або один на запит (якщо ви робите веб-програмування)

Якщо проект має відповідний розмір - якщо ви відчуваєте необхідність писати менше кодового коду - це цілком має сенс використання рамки (DI-). Плюсів і мінусів більше.


2
Ви можете використовувати бібліотеки DI, не використовуючи рамки взагалі.
Флоріан Маргаїн

5

З весною це здебільшого питання зручності.

Якщо у вас є клас, TopLevelякий представляє собою клас конструктів, MiddleLevelякий конструює клас LowLevel, і ви розумієте, що вам потрібен новий параметр конструктора LowLevel, ви також повинні додати його до TopLevelта MiddleLevelпросто так, що коли настане час для MiddleLevelпобудови LowLevelзначення, буде доступним щоб його можна було передати його конструктору. З весною ви просто додаєте примітку.

Також з весною можна визначити залежності у зовнішньому файлі конфігурації замість xml, і це нібито дає вам можливість генерувати нову систему із зовсім іншим проводком "без зміни жодного коду". (IMHO це повністю неправильно, оскільки зміна xml не так сильно відрізняється від коду зміни. Насправді, код зазвичай має набагато кращу перевірку помилок і перевірку типу, ніж xml.)

Інша справа, що багато людей бояться конструкторів; вони їх не розуміють, їм не подобається, вони краще не користуються ними.


3
Переважно згодні, особливо із зауваженням XML. ІМХО, боячись конструкторів - це, мабуть, погана причина використовувати рамку DI.
Роберт Харві

2
ІМХО, боячись конструкторів - це вагомий привід триматися подалі від програмування. C -: =
Майк Накіс

5
Але як це перевага перед фабрикою (статичною чи іншою)? (Яка перевага є тим, що ви можете скористатись відповідним варіантом, тоді як весна, здається, є всім чи нічим неприємним)
Річард Тінгл

@ RichardTingle Spring може представляти перевагу здебільшого завдяки всім іншим речам, окрім DI, адже очевидно, що DI можна досягти багатьма іншими способами, статичні заводи - це одне. (Один з найменш крутих, але все ж.) Але те, що задається питанням, чи потрібно використовувати весну для досягнення DI, і саме це я намагаюся відповісти: в основному, це не потрібно, просто зручність .
Майк Накіс

Це приклад того, що DI не є. "TopLevel" не повинен створювати MiddleLevel, а повинен отримувати його при побудові TopLevelяк аргумент до конструктора. Так само MiddleLevelслід отримати LowLevelв своєму конструкторі.
Ясніше

1

Кілька років тому я написав програму для моніторингу веб-сторінок, веб-портлетів, навіть певних таблиць баз даних у компанії, в якій я працював. Я хотів, щоб він був досить гнучким, щоб користувач міг вказати, які монітори будуть працювати та з якими параметрами (URL-адреси, входи, критерії успішності тощо). Тому я написав це для читання з XML-файлу та використання відображення Java для інстанціювання вказаних класів та використання методів сеттера для встановлення заданих параметрів.

Пізніше я з’ясував, що Весна зробить те ж саме і багато іншого.

Тож у моєму випадку я це знайшов

  1. Використання рамки ін'єкцій залежностей допомагає зробити програму гнучкою та полегшує вказівку, як вона буде працювати (в межах чітко визначених параметрів, звичайно).

  2. Використання системи DI для сторонніх розробників не дозволяє вам винаходити колесо.


4
Чи можете ви пояснити, чому визначати, який конкретний клас використовувати краще в xml, а не у файлі java. Це те, чого я ніколи не розумів.
Річард Тінгл

1
Це не магічна куля, але одна перевага використання конфігураційних файлів полягає в тому, що, принаймні теоретично, їх легше редагувати, ніж код. Крім того, їх може змінити користувач, який запускає вашу програму, але не має доступу до вашого вихідного коду. У прикладі, який я дав про свою програму ін'єкцій із сирою залежністю, я іноді міняв файл конфігурації XML, щоб я міг змінити те, як програма працювала, хоча я був тим, хто її написав. Якщо вам не потрібна зовнішня налаштування, це зробити простіше з кодом. У мене була інша робота, де ми зробили всі DI в коді, і це добре працювало.
Пол Дж. Абернаті
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.