Ключом DI-контейнеров является абстракция . Контейнеры DI отражают эту заботу о дизайне. Как вы можете догадаться, это оказывает заметное влияние на код, часто переводимый на меньшее количество конструкторов, сеттеров, фабрик и сборщиков. Как следствие, они делают ваш код более свободным (благодаря основному IoC ), более чистым и простым. Хотя и не без затрат.
Фон
Несколько лет назад такая абстракция требовала от нас написания различных конфигурационных файлов ( декларативное программирование ). Было фантастически видеть, что количество LOC значительно уменьшилось, но, хотя количество LOCS уменьшилось, число файлов конфигурации немного увеличилось. Для средних и небольших проектов это была не проблема, а для более крупных проектов "разбросанность кода", распределенная на 50% между кодом и XML-дескрипторами, стала проблемой ... Тем не менее, основной проблемой было сама парадигма. Это было довольно негибко, потому что дескрипторы оставляли мало места для настроек.
Парадигма постепенно сместилась в сторону соглашения по конфигурации , которое обменивает файлы конфигурации на аннотации или атрибуты. Это делает наш код чище и проще, в то же время предоставляя нам гибкость, которую XML не мог.
Вероятно, это самая существенная разница в том, как вы работали до сих пор. Меньше кода и больше магии.
С другой стороны ...
Соглашение о конфигурации делает абстракцию настолько тяжелой, что вы едва знаете, как она работает. Иногда кажется волшебным, и тут возникает еще один недостаток. Как только работа работает, многим разработчикам все равно, как она работает.
Это препятствие для тех, кто изучал DI с помощью DI-контейнеров. Они не до конца понимают актуальность шаблонов проектирования, передовой практики и принципов, которые были выделены контейнером. Я спросил разработчиков, знакомы ли они с DI и его преимуществами, и они ответили: - Да, я использовал Spring IoC -. (Что, черт возьми, это значит?!?)
Можно согласиться или нет с каждым из этих «недостатков». По моему скромному мнению, необходимо знать, что происходит в вашем проекте. В противном случае у нас нет полного понимания этого. Также стоит знать, для чего предназначен DI, и иметь представление о том, как его реализовать, это плюс для рассмотрения.
На положительной стороне ...
Одним словом производительность . Рамки позволяют нам сосредоточиться на том, что действительно имеет значение. Бизнес приложения.
Несмотря на отмеченные недостатки, для многих из нас (работа зависит от сроков и затрат), эти инструменты являются бесценным ресурсом. На мой взгляд, это должно быть нашим главным аргументом в пользу реализации DI-контейнеров. Производительность .
тестирование
Будь мы реализуем чистый DI или контейнеры, тестирование не будет проблемой. Наоборот. Одни и те же контейнеры часто предоставляют нам макеты для модульного тестирования из коробки. В течение многих лет я использовал свои тесты в качестве термометров. Они говорят мне, сильно ли я полагался на оборудование контейнеров. Я говорю это потому, что эти контейнеры могут инициализировать приватные атрибуты без сеттеров или конструкторов. Они могут вводить компоненты практически в любом месте!
Звучит заманчиво, верно? Быть осторожен! Не попадитесь в ловушку!
Предложения
Если вы решили внедрить контейнеры, я настоятельно рекомендую придерживаться передового опыта. Продолжайте реализовывать конструкторы, сеттеры и интерфейсы. Внедрите фреймворк / контейнер для их использования . Это упростит возможную миграцию на другую платформу или ее удаление. Это может значительно уменьшить зависимость от контейнера.
Относительно этой практики:
Когда использовать контейнеры DI
Мой ответ будет предвзятым из-за собственного опыта, в основном в пользу DI-контейнеров (как я уже говорил, я сильно сосредоточен на производительности, поэтому у меня никогда не было необходимости в чистом DI. Скорее наоборот).
Я думаю, что вы найдете интересную статью Марка Симана на эту тему, которая также отвечает на вопрос о том, как реализовать чистый DI .
Наконец, если бы мы говорили о Java, я бы сначала рассмотрел JSR330 - Dependency Injection .
Подведение итогов
Преимущества :
- Сокращение затрат и экономия времени. Производительность.
- Меньшее количество компонентов.
- Код становится проще и чище.
Недостатки :
- DI делегирован сторонним библиотекам. Мы должны осознавать их компромиссы, сильные и слабые стороны.
- Кривая обучения.
- Они быстро заставляют вас забыть о хороших привычках.
- Увеличение зависимости проекта (больше библиотек)
- Контейнеры, основанные на отражении, требуют больше ресурсов (памяти). Это важно, если мы ограничены ресурсами.
Отличия от чистого DI :
- Меньше кода и больше файлов конфигурации или аннотаций.