Ключ DI контейнерів - абстракція . DI контейнери абстрагують цю дизайнерську проблему для вас. Як ви здогадуєтесь, він помітно впливає на код, часто перекладається на меншу кількість конструкторів, сеттерів, заводів та будівельників. Як наслідок, вони роблять ваш код більш вільно сполученим (завдяки базовому ІОК ), більш чистим та простим. Хоча не без витрат.
Фони
Роки тому подібне абстрагування вимагало від нас писати різні конфігураційні файли ( декларативне програмування ). Було фантастично бачити, як кількість LOC значно зменшується, але, хоча LOCSs зменшувалася, кількість конфігураційних файлів трохи збільшувалася. Для середніх або малих проектів це взагалі не було проблемою, але для більш великих проектів, щоб "збірка коду" розсіялася на 50% між дескрипторами коду та XML, стала проблемою ... Тим не менш, головна проблема полягала в тому, що сама парадигма. Це було досить негнучким, оскільки дескриптори залишали мало місця для налаштування.
Парадигма поступово рухалася до конвенції щодо конфігурації , яка торгує конфігураційними файлами для приміток або атрибутів. Він тримає наш код більш чистим та простим, надаючи нам гнучкість, яку XML не міг.
Напевно, це найсуттєвіша різниця щодо того, як ви працювали до цього часу. Менше коду та більше магії.
З нижньої сторони ...
Конвенція щодо конфігурації робить абстракцію настільки важкою, що ви ледве знаєте, як вона працює. Іноді здається магічним, і тут виникає ще один недолік. Після роботи багато розробників не переймаються тим, як це працює.
Це гандикап для тих, хто навчився DI з контейнерами DI. Вони не повністю розуміють актуальність моделей дизайну, належну практику та принципи, які були вилучені з контейнера. Я запитав розробників, чи знайомі вони з DI та його перевагами, і вони відповіли: - Так, я використовував Spring IoC -. (Що за чорт це означає?!?)
З кожним із цих недоліків можна погодитись чи ні. На мою скромну думку, потрібно знати, що відбувається у вашому проекті. Інакше ми не маємо повного розуміння цього. Також слід знати, що таке DI, і мати поняття про те, як його реалізувати, є плюсом для розгляду.
З позитивного боку ...
Продуктивність одного слова . Структури дозволяють зосередитись на тому, що дійсно має значення. Бізнес програми.
Незважаючи на коментовані недоліки, для багатьох із нас (робота яких обумовлена строками та витратами) ці інструменти є неоціненним ресурсом. На мою думку, це має бути нашим головним аргументом на користь впровадження контейнерів DI. Продуктивність .
Тестування
Незалежно від того, чи будемо ми реалізувати чисті DI чи контейнери, тестування не буде проблемою. Зовсім навпаки. Ті ж контейнери часто дають нам макети для тестування одиниць поза коробкою. Протягом багатьох років я використовував свої тести як термометри. Вони мені кажуть, чи покладався я сильно на контейнерні споруди. Я говорю це тому, що ці контейнери можуть ініціалізувати приватні атрибути без сетерів чи конструкторів. Вони можуть вводити компоненти практично в будь-яке місце!
Звучить спокусливо правильно? Будь обережний! Не потрапляйте в пастку !!
Пропозиції
Якщо ви вирішили застосувати контейнери, я настійно пропоную дотримуватися належних практик. Продовжуйте впроваджувати конструктори, сетери та інтерфейси. Примушуйте рамки / контейнери використовувати їх . Це полегшить можливу міграцію до іншої системи або видалить фактичну. Це може значно зменшити залежність від контейнера.
Щодо цієї практики:
Коли використовувати контейнери DI
Моя відповідь буде упереджена власним досвідом, який в основному на користь DI контейнерів (як я коментував, я сильно зосереджений на продуктивності, тому в мене ніколи не було потреби в чистому DI. Зовсім навпаки).
Думаю, ви знайдете цікаву статтю Марка Семана про цю тему, яка також відповідає на питання про те, як реалізувати чистий DI .
Нарешті, якби ми говорили про Яву, я б спробував спочатку поглянути на JSR330 - залежне введення .
Підбиття підсумків
Переваги :
- Зниження витрат та економія часу. Продуктивність.
- Менша кількість компонентів.
- Код стає простішим і чистішим.
Недоліки :
- DI делеговано третім сторонам. Ми повинні усвідомлювати їхні компроміси, сильні та слабкі сторони.
- Крива навчання.
- Вони швидко змушують вас забути деякі хороші звички.
- Збільшення залежностей від проекту (більше лімб)
- Контейнери на основі рефлексії потребують більше ресурсів (пам'яті). Це важливо, якщо ми обмежені ресурсами.
Відмінності з чистим DI :
- Менше коду та більше файлів конфігурації чи приміток.